#include<bits/stdc++.h> #define ll long long #define ld long double #define int long long #define N 500005 #define Orz ios::sync_with_stdio(0),cin.tie(0) #define INF 2e18 #define rep(i,l,r) for(int i=l;i<=r;i++) #define pii pair<int,int> #define x first #define y second usingnamespace std; int n,m;
vector<int> KMP_match(char *S,int *F,char *T){ vector<int> ans; //回傳匹配相同地方 int p = -1; //紀錄短字串有多少被匹配 for(int i=0;T[i];i++){ //每一迴圈都讓T[i]被匹配到 while(p!=-1 && S[p+1]!=T[i]) p = F[p]; //使T[i]一定可以被匹配到 if(S[p+1] == T[i]) p += 1; //T的第i個與S的p+1可以匹配 if(!S[p+1]){ //S[p]已經匹配完成 ans.push_back(i-p); //回推匹配開頭 p = F[p]; //繼續下一輪匹配 } } return ans; }
//O(|S|)要配對的字串以及Fail Function voidKMP_build(char *S,int *F){ int p = F[0] = -1; //初始設定為-1 for(int i=1;S[i];i++){ //1到接下來字元 while(p!=-1 && S[p+1]!=S[i]) p = F[p]; //無法繼續配對,尋找更短字串 if(S[p+1] == S[i]) //配對成功(如都沒有一樣的就-1) p += 1; F[i] = p; //設定F[i] } }