POJ 3461Oulipo KMP模板

KMP之所以线性,因为匹配的时候i是不往回走的

我们只用调整j的位置

假设在s中找t

用二元组(i,j)表示s串的[i-j+1,i] 与t串的[1,j]匹配

假设s[i+1]和t[j]匹配上了,就j++

如果不匹配的话,我们就想办法调整j,

直到找到一个满足二元组条件的j并且t[j+1]=s[i]

快速调整j就是利用nxt数组的过程,

处理nxt的方法类似与两个串之间的匹配

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define N 1000010
 5 using namespace std;
 6 char s[N],t[N];
 7 int T,nxt[N],n,m,ans;
 8 int main()
 9 {
10     scanf("%d",&T);
11     getchar();
12     while (T--)
13     {
14     ans=0;
15     memset(nxt,0,sizeof(nxt));
16     scanf("%s%s",s+1,t+1);
17     n=strlen(s+1),m=strlen(t+1);
18     for (int i=2,j=0;i<=n;i++)
19     {
20         while (j>0 && s[j+1]!=s[i]) j=nxt[j];
21         if (s[j+1]==s[i]) j++;
22         nxt[i]=j;
23     }
24     for (int i=1,j=0;i<=m;i++)
25     {
26         while (j>0 && s[j+1]!=t[i]) j=nxt[j];
27         if (s[j+1]==t[i]) j++;
28         if (j==n) ans++,j=nxt[j];
29     }
30     printf("%d\n",ans);
31     }
32     return 0;
33 }

 

posted @ 2017-11-18 11:02  MSPqwq  阅读(147)  评论(0编辑  收藏  举报