KMP hdu-2203-亲和串

来源:互联网 发布:李小龙怎么死的 知乎 编辑:程序博客网 时间:2024/04/29 12:15

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2203

题目意思:

给两个字符串是s1,s2,如果是s1通过循环移动,能够使s2成为自己的子串,则输出yes,否则输出no.

解题思路:

将s1复制一遍,构成循环链,用KMP判断s2是否为子串。

注意字符串的下表从0开始,next数组相应的下表要改变下.

代码:

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<stack>#include<list>#include<queue>#define eps 1e-6#define INF (1<<30)#define PI acos(-1.0)using namespace std;#define Maxn 110000char save1[Maxn*2],save2[Maxn];char temp[Maxn];int n1,n2;int next[Maxn];void getnext(){   int j=-1;   next[0]=-1; //注意下表从0开始   for(int i=1;i<n2;i++)   {      while(j>=0&&save2[j+1]!=save2[i])         j=next[j];      if(save2[j+1]==save2[i])         j++;      next[i]=j; //next[i]表示当i+1不能满足时直接跳到next[i]的位置   }   return ;}bool judge(){   int j=-1;   for(int i=0;i<n1;i++)   {      while(j>=0&&save2[j+1]!=save1[i])         j=next[j];      if(save2[j+1]==save1[i])      {         j++;        // printf("i:%d j:%d ",i,j);      }      if(j==n2-1) //j表示已经扫描到了数组的最后一个元素         return true;   }   return false;}int main(){   while(scanf("%s%s",save1,save2)!=EOF)   {      strcpy(temp,save1);      strcat(save1,temp);      n1=strlen(save1),n2=strlen(save2);      getnext();      bool ans=judge();      if(ans)         printf("yes\n");      else         printf("no\n");   }   return 0;}


原创粉丝点击