【KMP】ZOJ-3587-Marlon's String
2012-03-14 00:48
288 查看
KMP的巧妙应用……
题目
题目
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define N 100005 int next ; long long f[2] ; void getnext(char str[]) { int i,j,len; len=strlen(str); i=0,j=-1; next[0]=-1; while(i<len) { if(j==-1||str[i]==str[j])next[++i]=++j; else j=next[j]; } } void KMP(char str[],char st[],int v) { int i,j,len1,len2; len1=strlen(str); len2=strlen(st); i=j=0; while(i<len1) { if(j==-1||str[i]==st[j]) { i++,j++; f[v][j]++; } else j=next[j]; } for(i=len2;i>=0;i--) if(f[v][i]>0&&next[i]>=0) f[v][next[i]]+=f[v][i]; } int main() { //freopen("a.txt","r",stdin); int i,t,len1,len2; long long ans; char str0 ,str1 ,st0 ,st1 ; scanf("%d",&t); while(t--) { scanf("%s%s",str0,st0); len1=strlen(str0); len2=strlen(st0); for(i=0;i<len1;i++)str1[len1-1-i]=str0[i]; str1[i]='\0'; for(i=0;i<len2;i++)st1[len2-1-i]=st0[i]; st1[i]='\0'; memset(f,0,sizeof(f)); getnext(st0); KMP(str0,st0,0); getnext(st1); KMP(str1,st1,1); ans=0; for(i=1;i<len2;i++)ans+=f[0][i]*f[1][len2-i]; printf("%lld\n",ans); } return 0; }
相关文章推荐
- ZOJ 题目3587 Marlon's String(KMP)
- ZOJ 3587 扩展KMP
- ZOJ 3587 Marlon's String 扩展KMP
- ZOJ 3587 Marlon's String 扩展KMP
- [zoj 3587]Marlon's String[kmp]
- 【KMP】ZOJ 3587
- Zoj 3587 Marlon's String (KMP 字符串拼接 前缀出现次数)
- ZOJ 3587 扩展KMP
- ZOJ 3587 扩展KMP应用
- ZOJ 题目3587 Marlon's String(KMP)
- zoj 3587 蛮好的KMP题
- zoj 1905 ||poj 2406 Power Strings(KMP||暴力)
- zoj 2177 Period (KMP )
- zoj——3957多重KMP
- zoj 2619 KMP+高斯消元+概率求期望
- 【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
- zoj 3587 Marlon's String
- KMP和扩展KMP ZOJ 3817 Chinese Knot
- zoj 2587 kmp的应用
- zoj 3785 What day is that day?(找规律,KMP)