using namespace std;
// 종만북 부분 일치 테이블
vector<int> getPartialMatch(const string& N)
{
int m = N.size();
vector<int> pi(m, 0);
int begin = 1, matched = 0;
while(begin + matched < m){
if(N[begin+matched] == N[matched]){
++matched;
pi[begin+matched-1] = matched;
}
else{
if(matched==0)
++begin;
else{
begin += matched - pi[matched-1];
matched = pi[matched-1];
}
}
}
return pi;
}
int solution(string s, string t){
vector<int> pi = getPartialMatch(t);
int ret = 0, matched = 0, S = s.size(), T = t.size();
int i = S > T ? S-T : 0, vt = T > S ? S : T;
while(i<S){
if(i+matched == S){
++ret;
i += matched - pi[matched-1];
vt -= (matched-pi[matched-1]);
matched = pi[matched-1];
}
else if(s[i+matched]!=t[matched]){
if(matched == 0){
++i;
--vt;
}
else{
i += matched - pi[matched-1];
vt -= (matched-pi[matched-1]);
matched = pi[matched-1];
}
}
else{
++matched;
if(matched == vt){
++ret;
i += matched - pi[matched-1];
vt -= (matched-pi[matched-1]);
matched = pi[matched-1];
}
}
}
return ret;
}
int main()
{
string s = "abcdaabbaa", t = "aabbaabbba";
cout << solution(s, t) << "\n";
return 0;
}
다른 사람 코드에서 KMP 쓰는거 보고 부랴부랴 종만북 펴서 풀어봤는데
한 6시간 걸린듯
이런 문제를 어떻게 30분 안에 풀지
십고수들 너무 무서워
원래 KMP 처음하면 어려워 걍 코드 외워라
나도 일관된 패턴 하나 정해놓고 외워서햇음
http://www-igm.univ-mlv.fr/~lecroq/string/node7.html.
설명도 직관적이고 코드도 무지 간결함. 나도 이거보고 kmp 안보고 짠다.
위 링크는 KMP 전신인 MP 알고리즘임.
뒤에 점 하나 땜에 404뜨는거였네 링크 ㄳㄳ