动态KMP算法-Codeforces1721E
引入题目:Codeforces1721E
使用该模板即可秒掉此题
- push:向字符串尾部添加一个字符
- pop:从字符串尾部删除一个字符
- query:查询该字符串的最长公共前后缀
template<typename S>
struct Dynamic_KMP{
vector<int> mp, kmp;
S s;
Dynamic_KMP() : mp(1, -1), kmp(1, -1) {
}
template<typename C>
void push(C c){
s.push_back(c);
int j = mp.back();
while (j >= 0 && s[j] != c) j = kmp[j];
j++;
if (mp.back() != -1 && s[mp.back()] == c) kmp.back() = kmp[mp.back()];
else kmp.back() = mp.back();
mp.push_back(j);
kmp.push_back(j);
}
void pop(){
s.pop_back();
mp.pop_back();
kmp.pop_back();
kmp.back() = mp.back();
}
int query(){
return mp.back();
}
};