6360: 词韵

时间限制: 2 Sec  内存限制: 128 MB
提交: 134  解决: 18
[提交] [状态] [讨论版] [命题人:admin]

题目描述

Adrian 很喜欢诗歌中的韵。他认为,两个单词押韵当且仅当它们的最长公共 后缀的长度至少是其中较长单词的长度减一。也就是说,单词 A 与单词 B 押韵 当且仅当 LCS(A, B) ≥ max(|A|, |B|) – 1。(其中 LCS 是最长公共后缀 longest common suffix 的缩写)
现在,Adrian 得到了 N 个单词。他想从中选出尽可能多的单词,要求它们能 组成一个单词序列,使得单词序列中任何两个相邻单词是押韵的。

输入

第一行是一个整数N。
接下来N行,每行一个由小写英文字母组成的字符串,表示每个单词。所有单词互不相同。

输出

输出一行,为一个整数,表示最长单词序列的长度。

样例输入

5
ask
psk
k
krafna
sk

样例输出

4

提示

一种最长单词序列是 ask-psk-sk-k。
30%的测试数据:1 ≤ N ≤ 20,所有单词长度之和不超过 3 000。
100%的测试数据:1 ≤ N ≤ 500 000,所有单词长度之和不超过 3 000 000。

来源/分类

2018北京冬令营1

【分析】

将所有单词逆序,并建立字典树,单词结尾结点加标记。

问题就转化为:

在字典树上找一条最长的路径,满足 ①只走标记结点 ②从结点u可以走向父结点、孩子结点、兄弟结点。

设数组 fdp[i] 表示以 i 结点为根节点时,可以从任一子树走上来,刚走到 i 时的最长路径(这是一条起始于子树,终结于点 i 的路径)。如图蓝色结点的蓝色路径为fdp表示最长路径:

设数组 dp[i] 表示以i结点为根节点时,把两个拥有最长fdp[]的子树连接起来,顺便把所有孩子结点连上的最长路径(这是一条从子树起始,终结于子树的路径)。如图粉红色结点,把两个拥有最大fdp的孩子连接到自己。

在dfs回溯过程中更新这两个数组即可。最后取数组中的最大值即为答案

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int MAX=1e6+5;struct node{char ch;int next;
}edge[MAX];
int cnt,head[MAX],val[MAX]; //val[i]结点i结尾的单词数
void init()
{memset(head,-1,sizeof(head));cnt=0;
}
void addedge(int u,char ch)
{edge[++cnt]=node{ch,head[u]};head[u]=cnt;
}
int new_word(char *str)
{int len=strlen(str);int u=0; //root nodefor(int i=0;i<len;i++){int flag=1;for(int j=head[u];j!=-1;j=edge[j].next){if(edge[j].ch==str[i]){flag=0;u=j;break;}}if(flag){addedge(u,str[i]);u=cnt; //新节点}}val[u]++; //单词结尾
}int fdp[MAX]; //点u的由叶子上来的可走最长路径
int dp[MAX]; //点u连接两个孩子时最大值
int dfs(int u) //return点u的由叶子上来的可走最长路径
{int mx[2]={0},mark=0;for(int i=head[u];i!=-1;i=edge[i].next){dfs(i);int mxchild=fdp[i]-val[i]; //不包括i本身的最长链if(mxchild>mx[1]){mx[0]=mx[1];mx[1]=mxchild;}else if(mxchild>mx[0])mx[0]=mxchild;mark+=val[i];}mark+=val[u];if(mx[0]>0)dp[u]=mx[0]+mx[1]+mark; //连接两孩子if(val[u])fdp[u]=mark+mx[1]; //最长单链
}char str[MAX];
int main()
{int n;scanf("%d",&n);init();for(int i=0;i<n;i++){scanf("%s",str);reverse(str,str+strlen(str));new_word(str);}dfs(0);int ans=0;for(int i=0;i<=cnt;i++)ans=max(ans,max(dp[i],fdp[i]));printf("%d\n",ans);
}

upc 6360: 词韵(字典树上dp)相关推荐

  1. upc 6360 词韵(字典树 + dp)

    6360: 词韵 时间限制: 2 Sec  内存限制: 128 MB 题目描述 Adrian 很喜欢诗歌中的韵.他认为,两个单词押韵当且仅当它们的最长公共 后缀的长度至少是其中较长单词的长度减一.也就 ...

  2. 6360: 词韵(字典树,DP)

    6360: 词韵 时间限制: 2 Sec  内存限制: 128 MB 提交: 171  解决: 31 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Adrian 很喜欢诗歌中的韵. ...

  3. UPC--6360: 词韵【字典树树上DP】

    6360: 词韵 时间限制: 2 Sec  内存限制: 128 MB 提交: 157  解决: 25 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Adrian 很喜欢诗歌中的韵. ...

  4. 6360: 词韵(2018北京冬令营1 )

    6360: 词韵 时间限制: 2 Sec  内存限制: 128 MB 题目描述 Adrian 很喜欢诗歌中的韵.他认为,两个单词押韵当且仅当它们的最长公共 后缀的长度至少是其中较长单词的长度减一.也就 ...

  5. CF633C Spy Syndrome 2(字典树+dp)

    CF633C Spy Syndrome 2 原题链接 说是 dpdpdp 但是感觉说是一个记忆化也可以.我们定义一个 dpdpdp 数组,其 dp[i]dp[i]dp[i] 含义为将加密串前 iii ...

  6. 莫队 ---- 值域分块处理优化字典树上的查询 杭电多校2021第二场1004 i love counting

    题目链接 题目大意: 就是给你nnn个数,mmm次询问 每次询问给你l,r,a,bl,r,a,bl,r,a,b问你在[l,r][l,r][l,r]区间里面有多少种种种数c(XOR)a≤bc(XOR)a ...

  7. 【ZJOI2019】线段树【线段树上dp】【大讨论】

    题意:有一个 [1,n][1,n][1,n] 的线段树和 mmm 个区间赋值操作,求任取一个操作的子集并按顺序在线段树上跑后线段树上有 lazy 标记的点的个数之和 模 998244353998244 ...

  8. 牛客网CSP-S提高组赛前集训营1题解(仓鼠的石子游戏 [博弈论] + 乃爱与城市的拥挤程度 [树上DP] + 小w的魔术扑克[dfs + 离线])

    文章目录 T1:仓鼠的石子游戏 题目 题解 代码实现 T2:乃爱与城市拥挤程度 题目 题解 代码实现 T3:小w的魔术扑克 题目 题解 代码实现 T1:仓鼠的石子游戏 题目 仓鼠和兔子被禁止玩电脑,无 ...

  9. 警卫站岗(树上dp)

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

最新文章

  1. 怎么优雅的处理Java异常?
  2. 清华大学大数据能力提升项目三名学生斩获2017年中国高校SAS数据分析大赛亚军
  3. Asp.net core 启动流程
  4. 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序打印字符串 | 递归要素 | 递归停止条件 | 递归操作 )
  5. Linux——CentOS建立一个最高权限的用户
  6. 《机器人爱好者(第2辑)》——部署机械手或末端执行器
  7. Android 沉浸式状态栏完美解决方案
  8. C# winForm utf8 gbk 相互转码小工具
  9. excel合并工作簿
  10. 鹰信 UC 登录状态同步方法
  11. Java ThreadLocalRandom 伪随机数生成器的源码深度解析与应用
  12. Argis ArcToolbox-分割栅格,无结果**
  13. 我是怎样使用BoundsChecker的
  14. 计算机个人swot分析报告,个人swot分析报告.doc
  15. macOS安装Cplex+yalmip
  16. 群晖7.1.0万兆网络实测
  17. 道路车辆 盲区监测(bsd)系统性能要求及试验方法_让你的爱车“多一双眼睛”——BSD盲点监测系统...
  18. Redis快速入门学习(基于狂神讲解)
  19. 以下是香港电视台主持人梁继璋写给儿子的备忘录,朴实地表达了一位父亲的劝戒与嘱咐...
  20. Appium+python自动化(一)- 环境搭建—上(超详解)

热门文章

  1. 迟到的2022年总结
  2. Android雷神游戏实训报告,实训报告1
  3. MySQL安装+初始化操作
  4. 美股中的道琼斯指数和纳斯达克指数
  5. windows10安装达梦数据库
  6. 三大视频格式转换器分享,你值得拥有
  7. 华为自研服务器芯片再下一城,从中国移动招标中获取近两成份额
  8. 群体智能优化算法之鲸鱼优化算法
  9. 神奇的树莓派+frp 随时随地变身服务器
  10. 通用模块(4)——4G 5G