码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • P7537 [COCI2016-2017#4] Rima


    由于题目涉及到后缀,不难想到用 trie 树处理。

    将每个字符串翻转插入 trie,后缀就变成了前缀,方便处理。

    条件 LCS ( A , B ) ≥ max ⁡ ( ∣ A ∣ , ∣ B ∣ ) − 1 \text{LCS}(A,B) \ge \max(|A|,|B|)-1 LCS(A,B)≥max(∣A∣,∣B∣)−1,说明 ∣ ∣ A ∣ − ∣ B ∣ ∣ ≤ 1 \left||A|-|B|\right|\le1 ∣∣A∣−∣B∣∣≤1。

    所以两个字符串押韵当且仅当在 trie 树上二者是父子或兄弟关系。

    考虑树型 DP,设 f i f_i fi​ 表示 i i i 所代表的字符串在序列最右边的最长序列长度, v a l i val_i vali​ 表示节点 i i i 是否(1/0)有单词, s z i = ∑ x ∈ s o n i v a l x sz_i=\sum\limits_{x\in son_i}val_x szi​=x∈soni​∑​valx​。

    显然有转移 f i = max ⁡ x ∈ s o n x ( f x ) + s z i − 1 + v a l i f_i=\max\limits_{x\in son_x}(f_x)+sz_i-1+val_i fi​=x∈sonx​max​(fx​)+szi​−1+vali​。

    如果 v a l i = 0 val_i=0 vali​=0,说明都没有字符串, f i = 0 f_i=0 fi​=0。

    更新答案时,记录儿子 f s o n i f_{son_i} fsoni​​ 的最大和次大,再加上剩余儿子和自己的 v a l val val。(感性理解,一条链只有两个位置是“自由”的,由此设出 DP 状态)

    本题卡空间,所以建 trie 树时要动态开点。

    具体实现参见代码。

    #include
    using namespace std;
    const int N=3e6+10;
    int cnt=1,n,f[N],ans;
    char a[N];
    struct node
    {
        vector<pair<int,int> > son;
        int fa,val;
    }tr[N];
    void insert(int rt,char a[],int len)
    {
        for(int i=0;i<len;i++){
            int x=a[i]-97;
            for(auto j:tr[rt].son){
                if(j.first==x){
                    rt=j.second;
                    goto a;
                }
            }
            tr[rt].son.push_back(make_pair(x,++cnt));
            rt=tr[rt].son.back().second;
            a:;
        }
        tr[rt].val++;
    }
    void dfs(int rt)
    {
        int aa=0,bb=0,x=0,y=0,sum=0;
        for(auto i:tr[rt].son){
            dfs(i.second);
            sum+=tr[i.second].val;
            f[rt]=max(f[rt],f[i.second]);
            if(f[i.second]>aa){
                bb=aa;
                aa=f[i.second];
                y=x;
                x=tr[i.second].val;
            }
            else if(f[i.second]>bb) bb=f[i.second],y=tr[i.second].val;
        }
        f[rt]+=sum-x;
        if(!tr[rt].son.size()) ans=max(ans,tr[rt].val);
        else ans=max(ans,aa+bb-x-y+sum+tr[rt].val);
        if(!tr[rt].val) f[rt]=0;
        else f[rt]++;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",a);
            int len=strlen(a);
            reverse(a,a+len);
            insert(1,a,len);
        }
        dfs(1);
        cout<<ans;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
  • 相关阅读:
    mysql基础知识篇(六)
    EF Core 如何应对高并发
    element-plus-自定义Dialog样式
    windows下安装cnpm
    通过霍夫直线检测方式获取直线,自定义提取直线(提取出两条接近平行的直线),将直线进行拟合
    JsonCpp JSON格式处理库的介绍和使用(面向业务编程-文件格式处理)
    Windows 系统服务器部署jar包时,推荐使用winsw,将jar包注册成服务,并设置开机启动。
    elasticsearch分析插件 安装analysis-ik
    PDF处理控件Aspose.PDF功能演示:使用C#查找和替换PDF文件中的文本
    【云原生之K8S】kubernetes核心组件
  • 原文地址:https://blog.csdn.net/dygxczn/article/details/133840187
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号