题解 P7537 [COCI2016-2017#4] Rima
1.题解 P7763 [COCI2016-2017#5] Ronald2.题解 P6497 [COCI2016-2017#2] Prosječni
3.题解 P7537 [COCI2016-2017#4] Rima
4.题解 P8017 [COCI2013-2014#4] UTRKA5.题解 P7751 [COCI2013-2014#2] PUTNIK6.题解 P7752 [COCI2013-2014#2] PALETA7.题解 P7586 [COCI2012-2013#1] SNAGA8.题解 P6485 [COCI2010-2011#4] PROSJEK9.题解 P6447 [COCI2010-2011#1] ŽABE10.题解P6677 [COCI2019-2020#2] Checker11.题解P8073 [COCI2009-2010#7] BAKICE12.题解P8084 [COCI2011-2012#4] BROJ13.题解P6370 [COCI2006-2007#6] KAMEN14.题解 P7165 [COCI2020-2021#1] Papričice15.题解 P9911 [COCI 2023/2024 #2] Kuglice16.题解 P6356 [COCI2007-2008#3] CUDAK17.题解 P7309 [COCI2018-2019#2] Kocka18.题解 P6548 [COCI2010-2011#2] IGRA19.题解 P6491 [COCI2010-2011#6] ABECEDA洛谷。
题意
显然。
分析
首先,我们要求的是最长公共后缀,这显然并不便于我们分析,因此,我们要做的第一件事就是将我们输入的串翻转。
第二,分析我们条件的性质。
,显然不成立。 ,当 是 的前缀时成立。 , 与 的前 都相同。
由于我们的长度不同以及题目的条件限制,我们显然不能直接线性 DP,因此,我们按照长度分类。
我们发现,由 或者更多,因为没有限制都是小写字母),但是我们由
这让我们想到了树的性质(考试的时候没有想到 Trie 树,后来发现 Trie 一方面卡空间,另一方面限制了只能是小写字母),因此,我们将
怎么连边呢,我们先将所有的
int cnt=0; for(int i=1; i<=n; ++i) { scanf("%s",s); int len=strlen(s); ull tot=0; for(int j=len-1; j; --j) tot=tot*P+s[j]; ull pre=tot; tot=tot*P+s[0]; u[i]=tot,v[i]=pre; num[++cnt]=u[i],num[++cnt]=v[i]; } sort(num+1,num+cnt+1); cnt=unique(num+1,num+cnt+1)-num-1; for(int i=1; i<=n; ++i) u[i]=lower_bound(num+1,num+cnt+1,u[i])-num; for(int i=1; i<=n; ++i) v[i]=lower_bound(num+1,num+cnt+1,v[i])-num; for(int i=1; i<=n; ++i) val[u[i]]=1,lj[v[i]].push_back(u[i]);
接下来解决重头戏:树形 DP。
找一下最终答案的性质,易于发现的,我们最终答案在长度上要么是单调递降,要么单调递增(与前者相同),要么是先下降后上升。放在树上可以发现,这就是我们垂下的两条链,所以,在大的方向上与树形 DP 求数的直径相同。
接下来是转移答案的过程,我们在分析时一直都忽略了一个问题,在长度相同的时候的合法情况,在树上时,这些长度相同的都会挂在同一个节点之下,这些节点我们直接取来即可,在最后将其重复贡献减去即可。
inline void dfs(int now) { if(vis[now]) return ;//标记是否走过 vis[now]=1; int tot=0; for(auto to:lj[now]) { if(!val[to]) continue;//不走构造出的不存在的 pre dfs(to); sec[now]=max(sec[now],mx[to]); if(sec[now]>mx[now]) swap(mx[now],sec[now]); ++tot; } ans=max(mx[now]+sec[now]+tot-min(tot,2)+val[now],ans);//减去重复贡献 mx[now]=mx[now]+tot-min(tot,1)+val[now];//继承最长的 }
在实现时,我们需要遍历每一个节点,包括我们构成的虚点,这样才能保证不漏记。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!