親和串
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5641 Accepted Submission(s): 2546
Problem Description 人隨著歲數的增長是越大越聰明還是越大越笨,這是一個值得全世界科學家思考的問題,同樣的問題Eddy也一直在思考,因為他在很小的時候就知道親和串如何判斷了,但是發現,現在長大了卻不知道怎麼去判斷親和串了,於是他只好又再一次來請教聰明且樂於助人的你來解決這個問題。
親和串的定義是這樣的:給定兩個字串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
Recommend lcy
KMP,直接搜尋也可過
#include <cstdio>#include <cstring>#define MAX 100010void getnext(char s[],int next[]){ int i,j,length; next[0]=-1; i=0; j=-1; length=strlen(s); while(i<length){ if(j==-1||s[i]==s[j]){ i++;j++;next[i]=j; } else j=next[j]; }}int kmp(char t[],char p[],int next[]){ int i=0,j=0; int len1=strlen(t),len2=strlen(p); while(i<len1&&j<len2){ if(j==-1||t[i]==p[j]) i++,j++; else j=next[j]; } if(j==len2) return i-len2; else return -1;}int main(){ char s1[MAX*2],s2[MAX]; int l1,l2,next[MAX]; while(~scanf("%s",s1)){ scanf("%s",s2); l1=strlen(s1); for(int i=0;i<l1;i++) s1[i+l1]=s1[i]; s1[l1*2]=0; getnext(s2,next); printf("%s\n",kmp(s1,s2,next)==-1?"no":"yes"); }}