思路:
題目的意思就是判斷串x是不是s的循環子串;可以用KMP來做,KMP模板就不多說了可以翻我之前寫的。
1、匹配成功的時候令直至遍歷完主串;
2、這裏s相當於主串,x爲模板串,每匹配成功一次就標記一下(pos[i]標記)匹配成功的那段起點(設爲1)和終點(設爲-1),最後遍歷pos數組求前綴和(sum)來判斷是否都是好位置。
判斷:
代碼:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 200000;
char s[N], x[N];
int ne[N], pos[N];
int main(){
cin >> s+1 >> x+1;
int ls = strlen(s+1);//求數組大小時注意主串和模板串均從1開始!!!
int lx = strlen(x+1);
for(int i = 2,j = 0; i <= lx; i++){
while(j && x[i] != x[j+1]) j = ne[j];
if(x[i] == x[j+1]) j++;
ne[i] = j;
}
for(int i = 1,j = 0; i <= ls; i++){
while(j && s[i] != x[j+1]) j = ne[j];
if(s[i] == x[j+1]) j++;
if(j == lx){
pos[i-lx+1] = 1;
pos[i] = -1;
j = ne[j];
}
}
int sum = 0;
for(int i = 1; i <= ls; i++) {
sum += pos[i];
if (!sum && pos[i] != -1) {//若sum爲0且此時pos[i]不是末尾的標記則匹配不成功
cout << "No" << endl;
return 0;
}
}
cout << "Yes" << endl;
return 0;
}