您的位置:首页 > 其它

FZU 1481 KMP

2012-05-04 14:33 246 查看
【题目大意】

判断两条环形字符串是否相同。

【思路】

将待匹配串复制一份接在后面,再用模式串做KMP,若能找到说明为同一个串。

蛮久没写KMP了,算法忘得差不多了..

小悲剧啊~

【CODE】

#include<iostream>
#include<cstdio>
using namespace std;

char t[222],s[444];
int next[222];

void setNext()
{
next[0]=-1;
int j=0,k=-1;
while( j<strlen(t) )
{
if( k==-1||t[j]==t[k] )
next[++j]=++k;
else k=next[k];
}
}

bool judge()
{
int l1=strlen(s),l2=strlen(t);
int i=0,j=0,k;
while( i<l1&&j<l2 )
{
if( j==-1||s[i]==t[j] )
i++,j++;
else
j=next[j];
}
return j==l2;
}

int main()
{
while( scanf("%s",&t)!=EOF )
{
setNext();
int sum=0,n;
scanf( "%d",&n );
while( n-- )
{
memset( s,0,sizeof(s) );
scanf( "%s",&s );
if( strlen(t)!=strlen(s) )
continue;
int len=strlen(s);
for( int i=0;i<len;i++ )
s[len+i]=s[i];
s[len<<1]=0;
if( judge() )
sum++;
}
printf( "%d\n",sum );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法