牛客練習賽 17-B 好位置(KMP)

鏈接:牛客練習賽 17-B 好位置

思路:

題目的意思就是判斷串x是不是s的循環子串;可以用KMP來做,KMP模板就不多說了可以翻我之前寫的。
1、匹配成功的時候令j=ne[j]j=ne[j]直至遍歷完主串;
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章