Extend the KMP simple question.
#include <stdio.h>#include<string.h>#defineMAXN 51010CharS[MAXN],T[MAXN];intEXTAND[MAXN],NEXT[MAXN];voidGetNextChar*t) { inti,k,j,len=strlen (t); next[0]=Len; I=0; while(i<len-1&&t[i]==t[i+1]) {i++; } next[1]=i; intA=1; for(k=2; k<len;k++) { intp=next[a]+a-1; intl=next[k-a]; if(K-1+l>=p) {intj=p-k+1>0? p-k+1:0; while(k+j<len&&t[k+j]==T[j]) J++; NEXT[K]=J; A=K; } Elsenext[k]=l; }}voidEKMP (Char*s,Char*t) { intI,j,slen=strlen (s), tlen=strlen (t), K; GetNext (t); intMinlen=slen<tlen?Slen:tlen; intA=0; while(A<minlen&&s[a]==t[a]) a++; extand[0]=A; A=0; for(k=1; k<slen;k++) { intp=a+extand[a]-1; intl=next[k-a]; if(K-1+l>=p) {intj=p-k+1>0? p-k+1:0; while(k+j<slen&&j<tlen&&s[k+j]==T[j]) J++; EXTAND[K]=J; A=K; } Elseextand[k]=l; }}intMain () {intI,j,tt; scanf ("%d",&TT); while(tt--) {scanf ("%s%s", s,t); EKMP (s,t); intlen=strlen (s); intans=0; for(i=0; i<len;i++) { //printf ("%d%d\n", extand[i],len-i); if(extand[i]>=len-i) ans++; } printf ("%d\n", ans+1); }}
UVA5876 writings on the Wall extended KMP