您的位置:首页 > 其它

kmp单片自动机

2016-06-22 10:59 197 查看
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;

int nxt[maxn];
// find s in t
int kmp(char *s, char *t) {
int ret = 0;
int m = strlen(s);
nxt[0] = -1;
for (int i = 1, j = -1; i < m; i++) {
while (j != -1 && s[i] != s[j + 1]) {
j = nxt[j];
}
if (s[i] == s[j + 1]) {
j++;
}
nxt[i] = j;
}
//  for(int i = 1 ; i < m; i ++){
//      cout <<" i =  "<<i <<" next  = "<< nxt[i] <<endl;
//  }
int n = strlen(t);
for (int i = 0, j = -1; i < n; i++) {
while (j != -1 && t[i] != s[j + 1]) {
j = nxt[j];
}
if (t[i] == s[j + 1]) {
j++;
}
if (j == m - 1) {
ret++;
j = nxt[j];
}
}
return ret ;
}

int main(){
char t[100] ="accbaccbaccaccbbbaccaccd" ;
char s[100] ="accaccd";
cout << t <<endl;
cout << kmp(s, t) << endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: