zoukankan      html  css  js  c++  java
  • 原样输出

    原样输出

    题目描述

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

    输入格式

    从文件 copy.in 中读入数据。
    第一行一个正整数 nnn ,表示(题面中)输入文件的行数。
    接下来 nnn 行,表示输入文件的内容。保证这 n 行中每行的每个字符是 A ext{A}A,C ext{C}C,G ext{G}G,T ext{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的根的该字符出边的终点。
  • 相关阅读:
    关键C函数备录
    TCP/UDP编程步骤和区别
    Pro C/C++环境搭建
    linux常用命令和选项
    运行在linux上的mysql常用命令
    把指针作为形参,用于取值的用法
    Leetcode476.Number Complement数字的补数
    Leetcode463.Island Perimeter岛屿的周长
    Leetcode461Hamming Distance汉明距离
    Leetcode455.Assign Cookies分发饼干
  • 原文地址:https://www.cnblogs.com/liankewei/p/10389629.html
Copyright © 2011-2022 走看看