模板索引 字符串

字典树

点击查看代码
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;
}
posted @ 2025-12-06 22:58  [丘李]Chilllee  阅读(6)  评论(0)    收藏  举报