首页 > 其他分享 >有序对的$LCP$

有序对的$LCP$

时间:2023-12-09 14:47:03浏览次数:29  
标签:cnt LCP limits get int sum 有序

求\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n} LCP(s_i, s_j)\)

方法一

\(1.\)Trie

\(2.\)求\(cnt\),\(cnt[i]\)表示以起点\(0\)到节点\(i\)的简单路径构成的字符串为前缀的字符串数量,可在插入时顺便维护。

\(3.\)求\(get\),\(get(s_i)\)表示获得\(\sum\limits_{j=1}^{n} LCP(s_i, s_j)\)。

struct trie
{
    int t[N][M], idx;
    int cnt[N];
    void insert(const string &s)
    {
        int k = 0;
        for (auto i : s)
        {
            int u = i - 'a';
            if (!t[k][u]) t[k][u] = ++idx;
            k = t[k][u];
            cnt[k]++;
        }
    }
 
    i64 get(const string &s)
    {
        int k = 0;
        i64 res = 0;
        for (auto i : s)
        {
            int u = i - 'a';
            if (!t[k][u]) break;
            k = t[k][u];
            res += cnt[k];
        }
        return res;
    }
};

\(4.\)求\(ans\),\(ans\)即表示\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n} LCP(s_i, s_j)\)。

先往\(t\)中插入所有字符串,再对每个字符串\(get\)求和即可。

Trie t;
for (int i = 1; i <= n; i++) t.insert(a[i]);
i64 ans = 0;
for (int i = 1; i <= n; i++) ans += t.get(a[i]);

例题

Collapsing Strings

标签:cnt,LCP,limits,get,int,sum,有序
From: https://www.cnblogs.com/xiojoy/p/17890924.html

相关文章

  • 网站建设,后台管理非常合理有序
    Translator   比同类别的其它服务器更实惠,给出了新老用户非常大的优惠与售后补贴,很适合个人与公司团队的网站建设,后台管理非常合理有序,还有各类产品供用户选择,大力支持阿贝云免费服务器。连接速度快,可用来测试,使用起来方便,不卡顿,而且永久免费,适合做网站服务器、数据处......
  • 刷题 字典树 LCP(最长公共前缀)
    2023.12.5cf1902E字典树的功能根据字典树的概念,我们可以发现:字典树的本质是把很多字符串拆成单个字符的形式,以树的方式存储起来。所以我们说字典树维护的是”字典“。那么根据这个最基本的性质,我们可以由此延伸出字典树的很多妙用。简单总结起来大体如下:1、维护字符串集合(即......
  • [LeetCode Hot 100] LeetCode21. 合并两个有序链表
    题目描述思路:新建dummy去"穿针引线"新建一个dummy节点去"穿针引线"注意最后返回的是dummy.next方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this......
  • 什么叫做有序集合?
    有序集合是一种数据结构,其中元素是有序排列的。这种“有序”可以有不同的含义,通常指的是元素按照某种明确的顺序存放,这个顺序在集合被创建时就确定了,并且通常会保持不变。在不同的编程语言和上下文中,有序集合可以有不同的特性和实现方式。以下是有序集合的一些关键特征:顺序性:元素的......
  • 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
    977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II 977.有序数组的平方思路:分别从数组的左,右向另一侧/中间趋近,新建立一个数组接收(有序序列)(动态地在过程中接收数据)  拓展为各个任务分配工作指针,形成多指针有序数字序......
  • LeetCode-Java:80.删除有序数组中的重复项 II
    题目给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入......
  • LeetCode-Java:26.删除有序数组的重复项
    题目给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组......
  • 浏览器关于 Largest Contentful Paint (LCP) 的计算机制
    LargestContentfulPaint(LCP)是一种用户体验的性能指标,旨在帮助开发者了解用户在浏览网页时视觉渲染的速度。LCP主要衡量的是视觉上最大的页面元素何时出现在屏幕上,这包括图像元素、视频元素或者包含文本的元素(如段落或列表项)。如果LCP时间较长,用户可能会感觉到页面加载速......
  • 删除有序链表中重复的元素-I
    publicListNodedeleteDuplicates(ListNodehead){//writecodehereListNodecur=head;while(cur!=null){while(cur.next!=null&&cur.val==cur.next.val){ListNodetemp=cur.next.next;//这里牵扯到内存......
  • LeetCode-Java:88合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1......