AABCD CDAA ASD ASDF
yes no
思路:把主串循环一圈,相当于得到了这些个串:
ABCDA
BCDAA
CDAAB
DAABC
这么些个子串也可以想象成一个串:AABCD|AABCD。
|后边表示循环的内容。
这个时候我们可以用KMP来实现:
#include<stdio.h> #include<string.h> using namespace std; char aa[100005]; char b[100005]; char a[300000]; int next[100005]; int lena,lenb; void set_naxt()//子串的next数组 { int i=0,j=-1; next[0]=-1; while(i<lenb) { if(j==-1||b[i]==b[j]) { i++; j++; next[i]=j; } else j=next[j]; } } int kmp() { int i=0,j=0; set_naxt(); while(i<lena) { if(j==-1||a[i]==b[j]) { i++;j++; } else j=next[j]; if(j==lenb) return 1; } return 0; } int main() { while(~scanf("%s%s",aa,b)) { strcpy(a,aa); strcat(a,aa); lena=strlen(a); lenb=strlen(b); if(kmp()) { printf("yes\n"); } else printf("no\n"); if(strstr(a,b)!=0) printf("yes\n"); else printf("no\n"); } }也可以用函数strstr实现:
#include<stdio.h> #include<string.h> using namespace std; char aa[100005]; char b[100005]; char a[300000]; int main() { while(~scanf("%s%s",aa,b)) { strcpy(a,aa); strcat(a,aa); if(strstr(a,b)!=0) printf("yes\n"); else printf("no\n"); } }