当前位置: 代码迷 >> 综合 >> FZU 1481 KMP
  详细解决方案

FZU 1481 KMP

热度:32   发布时间:2024-01-20 20:23:54.0

【题目大意】

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

【思路】

将待匹配串复制一份接在后面,再用模式串做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++;elsej=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;
}