您的位置:首页 > 其它

【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: