FZU 1481 KMP

来源:互联网 发布:mac连不到app store 编辑:程序博客网 时间:2024/05/16 04:57

【题目大意】

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

【思路】

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


原创粉丝点击