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 }