题意:如题
技巧 由于s1串是环形则将s1串扩大2倍 及 如123 串则 变为123123
裸KMP
ACcode:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
char A[maxn<<1],B[maxn];
int nextx[maxn];
int lenA,lenB;
void Get_nextx(){
int j=0,k=-1;
nextx[0]=-1;
while(j<lenB){
if(k == -1 || B[j] == B[k]){
nextx[++j]=++k;
}
k=nextx[k];
//printf("k==%d\n",k);
}
}
int KMP(){
Get_nextx();
int i=0,j=0;
while(i < lenA && j<lenB){
if(j == -1 || A[i] == B[j]){
i++;j++;
}
else j=nextx[j];
//printf("%d %d\n",i,j);
}
if(j == lenB) return 1;
else return 0;
}
int main(){
while(scanf("%s%s",A,B)!=EOF){
// printf("%s\n%s\n",A,B);
int len=strlen(A);
for(int i=0,j=len;i<len;i++,j++){ //扩展成环形
A[j]=A[i];
}
lenA=strlen(A);
lenB=strlen(B);
int res =KMP();
if(res == 1) puts("yes");
else puts("no");
}
return 0;
}