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;}
- KMP hdu-2203-亲和串
- HDU 2203 亲和串 KMP
- hdu 2203 亲和串 kmp
- hdu 2203 亲和串(KMP)
- 亲和串 - HDU 2203 KMP
- 【HDU】2203 亲和串 KMP
- HDU 2203(KMP) 亲和串
- HDU 2203 亲和串 (KMP)
- hdu 2203 亲和串 KMP
- HDU - 2203 亲和串(Kmp)
- HDU 2203 亲和串 KMP
- hdu 2203 亲和串(KMP|strstr())
- HDU 2203 亲和串(KMP:循环移位)
- HDU 2203 亲和串 KMP解法
- HDU 2203 亲和串(kmp)
- 亲和串 (hdu 2203 KMP)
- hdu 2203 亲和串 (kmp入门)
- HDU 2203 亲和串 (KMP或者strstr)
- 蜘蛛牌
- 黑马程序员-Java基础加强(3)
- 计算机科学技术专业相关教程资源
- 50个最优秀的 Photoshop 实例教程【文字特效篇】
- C库函数笔记
- KMP hdu-2203-亲和串
- unity3d_幻灯片效果
- MP3解码详解(还清高高手指点)
- linux中的命令格式解析
- 在网页中显示数学公式的方法
- 进程控制原理及程序设计
- Windows Embedded CE 7串口通信应用程序实例(上)
- 反射与Class类
- Lucene 工作原理