A,B,C水
D。
有一个串,长度为n+2,
现在知道他的所有n个 长度为3的子串是什么
求出原始的串
这题跟POJ 2337有点像
最后抽象出的问题就是求欧拉通路:
将每个长度为3的子串, 前两个字母(数字)看成一个结点, 后两个字母(数字)看成一个结点,
然后这个子串就相当于 一条从前一个结点到后一个结点的边
欧拉通路的要求就是所有边都要走一遍, 所以最后就是求欧拉通路了
结点的个数最大为62*62,边的数量显然就是n了
因为两个字母(数字)hash成数字的话也就是62*62种
首先要判断这个欧拉通路是否存在
首先计算每个结点的入度和出度,
然后如果一个有向图存在欧拉通路。
则任意结点的出度跟入度的差的绝对值 不大于1
并且统计abs(出度-入度)==1 的结点的数量,假设为x个
则x必然为0或者2
如果为0个,则欧拉通路在任意一点都可当做起点
如果为2个,则欧拉通路从(出度-入度)==1 的结点出发
求欧拉通路的时候我们dfs即可,每条边会有一个编号,保证每条边只走一次。
但是需要注意的是,这个n是有20万的, 重边和自环多了会出一些问题。
所以我就将重边看成1条,但是对其计数,在dfs的时候用边的数量当做是否访问过的标记
#include
#include
#include
#include
#include
#include
#include
#include
E
题意是
给出n个区间。
然后第i个区间表示的是第i个左括号与右括号的 下标距离范围
求出一个合法的括号序列 并且满足这些范围
然后后来想了想,貌似是个记忆化dp, 而且并不难。。
令dp[i][j]表示第i个到第j个左括号是否都成功的匹配到了右括号
那么在dfs的时候,对于dp[i][j] , 我们枚举i被第几个右括号匹配了,显然是从第i个右括号枚举到第j个右括号,假设被第k个右括号匹配并且满足之前给的范围了
然后就可以去寻找其子状态 dp[i + 1][k] 以及dp[k+1][j]
#include
#include
#include
#include
#include
#include
#include
#include