字典树
点击查看代码
void insert(char *str){
int rot = 0; // 当前子树根节点
int len = strlen(str);
int res = 0 ; // 表示字典树路径上存在有几个别的单词,用于这道题统计答案
for(int i = 0; i < len; i++){
int c = str[i] - 'a';
if(trie[rot][c] == 0)// 没有这个节点
trie[rot][c] = ++tot;
rot = trie[rot][c]; // 跳到该节点
res += word[rot];
}
word[rot]++;
if(res + 1 > ans) ans = res + 1;
}
KMP
点击查看代码
vector<int> prefix_function(string s) {
int n = (int)s.length();
vector<int> pi(n);
for (int i = 1; i < n; i++) {
int j = pi[i - 1];
while (j > 0 && s[i] != s[j]) j = pi[j - 1];
if (s[i] == s[j]) j++;
pi[i] = j;
}
return pi;
}
点击查看代码
vector<int> find_occurrences(string text, string pattern) {
string cur = pattern + '#' + text;
int sz1 = text.size(), sz2 = pattern.size();
vector<int> v;
vector<int> lps = prefix_function(cur);
for (int i = sz2 + 1; i <= sz1 + sz2; i++) {
if (lps[i] == sz2) v.push_back(i - 2 * sz2);
}
return v;
}