您的位置:首页 > 其它

poj3461Oulipo【kmp】

2015-08-27 17:38 260 查看
大意:kmp

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 1000005;

int next[maxn];

void get(char *s) {
int l = strlen(s);
int j = 0, k = -1;
next[0] = -1;
while(j < l) {
if(k == -1 || s[j] == s[k]) {
next[++j] = ++k;
} else {
k = next[k];
}
}
}

int kmp(char *s1, char *s2) {
int l1 = strlen(s1), l2 = strlen(s2);
int i = 0, j = 0;
int sum = 0;
get(s2);
while(i < l1 && j < l2) {
if(j == -1 || s1[i] == s2[j]) {
i++; j++;
} else {
j = next[j];
}
if(j == l2) {
sum++;
j = next[j];
}
}
return sum;
}

char s1[maxn], s2[maxn];
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%s",s1);
scanf("%s",s2);
//        printf("%s %s\n",s1, s2);
printf("%d\n", kmp(s2,s1));
}
}


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