문자열 S에서 T가 나오는동안 다 지우고 남은 문자열을 출력하는 문제다계속 틀렸따 푸는 방법을 알았는데도 코딩을 못해서 계속틀렸다 푸는 방법은 KMP로 S에서 T를 찾다가 찾으면 바로 제거하고 남은부분을 다시 KMP하는 방법이다! 이걸 다른곳에서 만나면 또 틀릴것같다 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243#include #include #include #include using namespace std;char ans[1000011];int top;vector preprocessing(string & s) { int n = s.size(); int j = 0; vector pi(n, 0); for ..
Bessie와 Elsie가 1에서 출발해 N에서 만나려고한다간선은 M개가 주어진다(간선은 낮은숫자 ->높으숫자만 가능)근데 둘이 간선을 지나갈 때의 시간이 다르다이 때 M에서 만날 수 있는 최소의 시간을 구하는 문제다N이 16밖에 안되기 때문에 bfs로 모든 경로를 다 구했다그리고 N까지 가는 시간 중 가장 작은수를 출력하면 답이다! 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243#include #include #include #include #include using namespace std;int n, m;void bfs(vector& Graph, set&S) { queue q; q.push({ 0,0 ..
문제가 좀 길다요약하자면 X진법으로 나타낸 수 A와 Y진법으로 나타낸 수 B를 줄 때A=B를 만드는 X와 Y를 찾는 문제다 예를들어 A = 419 // B = 782를 줬을 때8892 를 47진법으로 나타내면 419 , 35진법으로 나타내면 782 이므로답은 X=47, Y=35 이다 문제는 길지만 수가 작아서 쉽다완탐으로 진짜 다 해보면 된다~! 소스코드123456789101112131415161718192021222324252627282930313233343536#include #include #include using namespace std;#define ll long long vector vt; ll go(ll a, ll b) { ll ret = 0; ll c = 1; while (a != 0) ..
왼쪽 끝에서 오른쪽 끝으로 가려고한다이 때 가지고있는 값이 달라야하며, 왼쪽 오른쪽 각각 1칸이상 떨어져있어야한다DP로 풀면된다! x,y를 대각선부터보면서 갈수있으면 더해가고 오른쪽 끝이라면 return1한다~ 소스코드123456789101112131415161718192021222324252627282930313233#include #include using namespace std;#define ll long longint arr[111][111],n,m,k;int d[111][111];int dx[3] = { 1,1,0 };int dy[3] = { 0,1,1 };int mod = 1e9 + 7;int go(int x, int y) { if (x == n - 1 && y == m - 1) return..
문자열 S에서 T가 없을때까지 계속 지우고 S를 출력하는 문제다처음에 그냥 string STL도 써보고 kmp도 써봤는데 시간초과났다 ㅎㅎ100만이더라 ㅎㅎ 그래서 스택으로 풀었다 진짜 스택을 써서 풀었는데 그럼 넘 느렸다앞으로는 스택의 개념만 쓰도록 하자그럼 짱빠르다 굿소스코드(스택 진짜 씀;;;;)1234567891011121314151617181920212223242526272829303132#include #include #include #include using namespace std;int main() { stack st; string s, t; cin >> s >> t; int n = s.size(); int m = t.size(); reverse(t.begin(), t.end()); fo..
suffix array를 이용하는 문제다suffix array에 관한건 구글링을....!원리는 1,2,4,8...,len 까지 이전에 구한것을 이용해 O(1)만에 계속 구해가는 것이다 suffix array에 대한 설명이 없는점 죄송 ㅎㅎ 어렵네요 이거..저도 아직 완벽하게 정리가 안된지라 ㅎㅎ좀 더 공부해서 나중에 이론게시판에 쓰는걸로..! 소스코드12345678910111213141516171819202122232425#include #include #include #include using namespace std;int main() { string s; cin >> s; int n = s.size(), l = 1; vector sa(n), g(n + 1), ng(n + 1); g[n] = ng[n..
과제를 하루에 하나씩 할 수 있고 , 데드라인과 받을 수 있는 점수를 알려준다이 때 점수의 최댓값을 구하는 문제!흔히 볼 수 있는 dp문제다 우리는 과제를 하나하나 보며 선택하면 된다! d[N(n번째 과제)][T(현재시간)]로 테이블을 잡는다 기본값은 과제를 안하고 넘어가는 값으로 잡는다그리고 만약 현재의 과제 데드라인보다 시간이 작다면 과제를 하는것과 비교한다! 소스코드12345678910111213141516171819202122232425#include #include #include #include using namespace std;int n,d[1010][1010];vector vt;int go(int pos, int t) { if (pos == n || t > 1000) return 0; i..
숫자가 주어질 때 오름차순으로 만들려 한다숫자 두개를 swap 가능할 때 최소의 swap 수를 구하면 된다 입력받은 숫자를 정렬시켜서 있어야 할 자리가 맞는지 2중 for문으로 확인하고 제출했다 근데 바로 틀렸따 ㅎㅎㅎ 고민하다가 그냥 생각없이 뒤에서부터 확인하니까 답보다 1이 크게나왔다똑같이 나올 줄 알았는데...그래서 어떤수에서는 앞에서부터 보는거보다 뒤에서부터 보는게 작겠구나~ 생각하고 앞에서부터 비교한 답 & 뒤에서부터 비교한 답을 비교해서 작은답을 출력하니 맞았다! 소스코드12345678910111213141516171819202122232425262728293031#include #include #include using namespace std;int n;int check(vector&a, ..
유저가 N명이 있고 각자의 비밀번호가 주어진다이 때 내 비밀번호가 다른사람의 substring이라면 나의 비밀번호를 입력해서 그 사람의 계정으로 접속이 가능하다..! 문제는 모든 사람에 대해 본인의 계정을 제외한 접속가능한 다른계정의 수를 모두 찾는 것이다! set과 map을 이용하면 풀 수 있는 문제지만 결국 못풀었다 ㅎㅎ쉬운문젠대 왜 생각을 못했을까...! set,map마스터 해야겠다 푸는 방법은 비밀번호를 입력받으며 set에 substring을 다 넣는다그리고 map에서 substring의 수를 +1해준다모든 비밀번호에 대해 수행하고 마지막에 그 수를 더하고 n만큼 빼면(본인계정접속 수) 접속 가능한 다른사람계정 수가 나온다 소스코드1234567891011121314151617181920212223..