分为两步
1.构建next数组
2.KMP遍历
已经是最基本的板子了
参考连接:3008. 找出数组中的美丽下标 II - 力扣(LeetCode)
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int>next1;
void getnext(vector<int>&next1, string s){
int n=s.size();
next1.assign(n,0);
for(int i=1,j=0;i<n;i++){
while(j > 0 && s[i]!=s[j])j=next1[j-1];
if(s[i]==s[j])j++;
next1[i]=j;
}
}
int BuildKMP(vector<int>&next1,string s1,string s2){
for(int i=0,j=0;j<s1.size();j++){
while(i > 0 && s1[j]!=s2[i]) i = next1[i-1];
if(s1[j] == s2[i])i++;
if(i==s2.size()){
return j-i+1;
}
}
return -1;
}
int main(){
string s;
cin >> s;
int n;
cin >> n;
string t;
while(n--){
cin >> t;
getnext(next1,t);
int n=BuildKMP(next1,s,t);
if(n==-1)cout << "Not Found" << endl;
else cout << s.substr(n) << endl;
}
}