数据结构都在学。。。。
Problem Description
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
Input
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
Output
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
Sample Input
AABCD CDAA ASD ASDF
Sample Output
yes no
Author
Eddy
代码:
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<algorithm> #define INF 99999999 using namespace std; const int MAX=100000+10; char s1[MAX],s2[MAX]; int next[MAX]; void get_next(char *a){ int len=strlen(a); int j=-1,i=0; next[0]=-1; while(i<len){ if(j == -1 || a[i] == a[j]){ if(a[++i] != a[++j])next[i]=j; else next[i]=next[j]; }else j=next[j]; } } bool KMP(char *a,char *b){ int lena=strlen(a),lenb=strlen(b); int i=0,j=0; while(j<lena){ if(j == -1 || b[i] == a[j])i=(i+1)%lenb,++j; else j=next[j]; if( i == 0 && j == 0)break;//表示匹配主串又是从第一位开始匹配 } if(j == lena)return true; else return false; } int main(){ while(cin>>s1>>s2){ if(strlen(s2)>strlen(s1)){cout<<"no"<<endl;continue;} get_next(s2); if(KMP(s2,s1))cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }