题目:
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题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
题意描述:
输入两个字符串s1和s2
判断能否通过循环移动1使得s2包含在s1中,能输出“yes”否则输出“no”。
解题思路:
首先是一个这是一个字符串匹配问题,其次说是能否通过循环移动使得s2包含在s1中,如果真的一位一位循环移动的话,可能超时不说,确实有些麻烦,那么我们可以讲两个s1串接在一起,这样其实也就是循环移动的最终
结果,最后将s2在两个s1的串中只用KMP进行匹配就好了。
代码实现:
1 #include<stdio.h> 2 #include<string.h> 3 char S[200020],T[100010]; 4 int kmp(char *S, char *T); 5 int get_next(char *T,int *next); 6 int main() 7 { 8 int l1,l2; 9 char c[100010]; 10 while(scanf("%s%s",S,T) != EOF) 11 { 12 l1=strlen(S); 13 l2=strlen(T); 14 if(l1 < l2) 15 { 16 printf("no "); 17 continue; 18 } 19 else 20 { 21 strcpy(c,S); 22 strcat(S,c); 23 kmp(S,T); 24 } 25 } 26 return 0; 27 } 28 int get_next(char *T,int *next) 29 { 30 int i=0,j=-1,l2; 31 l2=strlen(T); 32 next[0]=-1; 33 while( i < l2 ) 34 { 35 if(j == -1 || T[i] == T[j]) 36 { 37 ++i; 38 ++j; 39 next[i]=j; 40 } 41 else 42 j=next[j]; 43 } 44 /*for(i=0;i<l2;i++) 45 printf("%d ",next[i]); 46 printf(" ");*/ 47 } 48 int kmp(char *S, char *T) 49 { 50 int i=0,j=0,l1,l2; 51 l1=strlen(S); 52 l2=strlen(T); 53 int next[100010]; 54 get_next(T,next); 55 while(i < l1 && j < l2) 56 { 57 if(j==-1 || S[i] == T[j]) 58 { 59 ++i; 60 ++j; 61 } 62 else 63 j=next[j]; 64 } 65 //printf("%d ",j); 66 if(j >= l2) 67 printf("yes "); 68 else 69 printf("no "); 70 }