KMP模板(2203)

来源:互联网 发布:91pron 永久域名 编辑:程序博客网 时间:2024/06/06 17:03

亲和串

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11495    Accepted Submission(s): 5182


Problem Description
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
 

Input
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
 

Output
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
 

Sample Input
AABCDCDAAASDASDF
 

Sample Output
yesno

此题其实直接使用字符串的库函数就能解决(如string类的find函数),注意点是将s对于自身复制连接之后,即使t匹配到了,也未必成立,如输入数据AAA和AAAA,所以要特判一下两串长度大小。


/*------------------Header Files------------------*/#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <algorithm>#include <cstdlib>#include <ctype.h>#include <cmath>#include <stack>#include <queue>#include <deque>#include <map>#include <vector>#include <set>#include <limits.h>using namespace std;/*------------------Definitions-------------------*/#define LL long long#define uLL unsigned long long#define PI acos(-1.0)#define INF 0x3F3F3F3F#define MOD 1000000007#define MAX 105#define lson rt<<1,l,m#define rson rt<<1|1,m+1,r/*---------------------Work-----------------------*/string s,t;int lens,lent;int _next[100050];void getnext(){int i=0,j=-1;_next[0]=-1;while(i<lent){if(j==-1||t[i]==t[j]){i++,j++;_next[i]=j;}else j=_next[j];}}int KMP(){int i=0,j=0;while(i<lens){if(j==-1||s[i]==t[j]) i++,j++;else j=_next[j];if(j==lent) return i-j+1;}return -1;}void work(){while(cin>>s>>t){if(s.length()<t.length()){printf("no\n");continue;}s+=s;lens=s.length();lent=t.length();getnext();if(KMP()==-1) printf("no\n");else printf("yes\n");}}/*------------------Main Function------------------*/int main(){//freopen("test.txt","r",stdin);work();return 0;}




0 0
原创粉丝点击