首页 > 其他分享 >ABC353E字典树处理最长公共前缀

ABC353E字典树处理最长公共前缀

时间:2024-05-11 22:42:05浏览次数:32  
标签:std nxt 前缀 ABC353E int siz now 字典

https://atcoder.jp/contests/abc353/tasks/abc353_e

其实就是字典树板子题。

似乎遇到最长公共前缀,就该想到字典树。

依次加入每个字符串:

维护一个数组 siz 来统计在当前串之前的串在对应点的出现次数。

手模一下字典树的建树过程,显然如果当前串 \(S_i\) 能跑到一个曾经串 \(S_j\) 也出现过的点,那么这一个点肯定是 \(S_i\) 和 \(S_j\) 最长公共前缀的一部分,所以全部加入答案。

template <typename T>
struct Trie {
    int m;
    int N = 2e6;
    int now, tot;
    i64 ans;
    std::vector<T> val;
    std::vector<int> siz;//用来维护在加入这个字符串之前有多少个字符串到过字典树的这个位置
    std::vector<std::map<T, int> > nxt;
    Trie():val(N), siz(1, 0), tot(1), nxt(1, std::map<T, int>()), ans(0){}

    void add(std::string s) {
        now = 0;
        for (int i = 0; i < s.size(); i++){
            if (nxt[now][s[i]] == 0) {
                nxt[now][s[i]] = tot; siz.push_back(0); val[tot++] = s[i];
            }
            now = nxt[now][s[i]];
            ans += siz[now];//只要当前这个字符串也能到,那肯定是和之前字符串的公共前缀的一部分,加入进去
            siz[now] += 1;
            nxt.push_back(std::map<T, int>());
        }
    }
};

signed main() {

    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n;
    std::cin >> n;
    Trie<char> trie;
    std::string s;
    for (int i = 0; i < n; i++) {
        std::cin >> s;
        trie.add(s);
    }

    std::cout << trie.ans << '\n';

    return 0;
}

标签:std,nxt,前缀,ABC353E,int,siz,now,字典
From: https://www.cnblogs.com/kdlyh/p/18187297

相关文章

  • Python-有序字典OrderedDict练习题
    问题:读取键盘输入结果,创建n个键值对,将其排序后放入有序字典并输出。详细描述:根据提示,实现函数功能:读取n(n>0)行输入,以每一行的数据为key,行号(从0开始)为value,建立n对键值对,然后将他们按照key排序后,放入一个有序字典,最后输出这个有序字典。importcollectionsdefFunc():pairs......
  • 一篇文章掌握Python中多种表达式的使用:算术表达式、字符串表达式、列表推导式、字典推
    Python中的表达式可以包含各种元素,如变量、常量、运算符、函数调用等。以下是Python表达式的一些分类及其详细例子:1.算术表达式算术表达式涉及基本的数学运算,如加、减、乘、除等。#加法表达式sum=3+5#结果为8#乘法表达式product=4*6#结果为24#复......
  • P4407 [JSOI2009] 电子字典
    题目链接:https://www.luogu.com.cn/problem/P4407trie树+爆搜做法:对所有文本串建树。对于编辑距离要求的三种情况,分四类在trie树上爆搜即可。#definemaxn200010structtrie{intson[maxn][26];intcnt[maxn];intidx=0;map<string,bool>mm;intv......
  • Python中级之数据类型的内置方法2(字典和列表)
    【一】字符串类型的内置方法(熟悉)【1】查找(1)find方法#【1】默认从左到右开始查找,找得到则返回元素所在的索引位置name='ligo'str=name.find('i')print(str)#输出1#【2】也可在区间内寻找,找不到则返回-1str=name.find('g',3,4)print(str)#输出-1#【3】也......
  • 前缀和
    前缀和一维前缀和S[i]=a[1]+a[2]+...a[i]a[l]+...+a[r]=S[r]-S[l-1]//注意,S从1开始比较好二维前缀和S[i,j]=第i行j列格子左上部分所有元素的和以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和为:S[x2,y2]-S[x1-1,y2]-S[x2,y1-1]+S[x1......
  • 208. 实现 Trie (前缀树)-python
    Trie(发音类似"try")或者说前缀树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现Trie类:Trie()初始化前缀树对象。voidinsert(Stringword)向前缀树中插入字符串word。booleansearch(St......
  • 前缀和与组合数
    前缀和与组合数一道题会涉及组合数一般有这么几种可能题目公式里直接带了组合数。题目和排列组合相关特殊的高维前缀和第一种第二种比较明显的和组合数相关联。而第三种就和组合数的性质相关。我认为多次前缀和会与组合数产生联系的本质是组合数的一个公式。\(C(m,n)=C(......
  • 2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。 要进行分割操作,直到字
    2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。要进行分割操作,直到字符串s为空:选择s的最长前缀,该前缀最多包含k个不同字符;删除该前缀,递增分割计数。如果有剩余字符,它们保持原来的顺序。在操作之前,可以修改字符串s中的一个字符为另一个小写英文字母。在最佳情......
  • python3.2:字典
    字典相比较列表,优势:查找key的需求,列表需要遍历,字典查找速度很快,很方便,定义 特性查找、增加和修改操作 删除操作循环操作 全局函数 ......
  • 在Python中将字典转为成员变量的方法
    当我们在Python中写一个class时,如果有一部分的成员变量需要用一个字典来命名和赋值,此时应该如何操作呢?这个场景最常见于从一个文件(比如json、npz之类的文件)中读取字典变量到内存当中,再赋值给一个类的成员变量,或者已经生成的实例变量。使用__dict__定义成员变量在python中直接支......