原样输出

原样输出

题目描述

nealchen 是一只 copycat。
它会把输入按行读入,原封不动地复制到输出中去。
但是在一次更新以后,它的程序出了一些问题。
它没法输出换行符了。
并且,读入的时候,总会莫名其妙地随机漏掉开头和结尾的若干个字符,甚至整行都会漏掉。
比如 orznight\text{orznight}orznight 可能会变成 rzni\text{rzni}rzni ,orz\text{orz}orz,h\text{h}h 或者空串。
现在你找到一份输入文件丢给 nealchen,你想知道它的输出可能有多少种情况,以及每种情况分别是什么。
由于你找到的输入文件全部来自之前的福建省选,所以所有的输入文件每行只可能包含 A\text{A}A,C\text{C}C,G\text{G}G,T\text{T}T 四种字符。

输入格式

从文件 copy.in 中读入数据。
第一行一个正整数 nnn ,表示(题面中)输入文件的行数。
接下来 nnn 行,表示输入文件的内容。保证这 n 行中每行的每个字符是 A\text{A}A,C\text{C}C,G\text{G}G,T\text{T}T四种字符中的一种。
接下来一个整数 kkk(0≤k≤10 \le k \le 10k1) ,具体含义详见输出格式。

输出格式

输出到文件 copy.out 中。
若 k=0k = 0k=0 ,你需要输出一行,表示输出的可能情况个数模 109+710^9 + 7109​​+7 的结果。
若 k=1k = 1k=1 ,你需要按照字典序从小到大输出所有可能的输出情况,一行一个字符串,最后一行输出输出的可能情况个数模 109+710^9 + 7109​​+7 的结果。


solution
首先如果只有一个串,那就是求本质不同的字串数。
建出后缀自动机,把dp统计即可。
现在有多个串。
如果我们要验证一个串是不是合法的,显然贪心最优。
所以可以把sam一个个连起来,用同样的方法拓扑序统计就。
具体实现要从后往前,把没有某字符出边的点的该出边连到下一个sam的根的该字符出边的终点。
posted @   liankewei123456  阅读(342)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示