【题目大意】
判断两条环形字符串是否相同。
【思路】
将待匹配串复制一份接在后面,再用模式串做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;
}