void getNext(string t, vector<int> &nxt) {//求出字符串t的next数组
nxt.resize(t.size() + 1);
for(int i = 1, j = 0; i < t.size(); i++) {
while(j && t[i] != t[j]) {
j = nxt[j];
}
j += (t[i] == t[j]);
nxt[i + 1] = j;
}
}
int find(string s, string t) {//在字符串s中寻找字符串t第一次出现的位置,没找到则返回-1
vector<int> nxt;
getNext(t, nxt);
for(int i = 0, j = 0; i < s.size(); i++) {
while(j && s[i] != t[j]) {
j = nxt[j];
}
j += (s[i] == t[j]);
if(j == t.size()) {
return i - t.size() + 2;
}
}
return -1;
}
bool find(string s, string t, vector<int> &ans) {//在字符串s中寻找字符串t所有出现的位置,没找到则返回false
ans.clear();
vector<int> nxt;
getNext(t, nxt);
for(int i = 0, j = 0; i < s.size(); i++) {
while(j && s[i] != t[j]) {
j = nxt[j];
}
j += (s[i] == t[j]);
if(j == t.size()) {
ans.emplace_back(i - t.size() + 2);
j = nxt[j];
}
}
return !ans.empty();
}