Atcoder abc307
https://atcoder.jp/contests/abc307/tasks
Ex - Marquee
给定长度L的字符串S, 包含大小写字母, 在宽W的滚动显示器上,每次移动一个字母
因此有L+W-1种状态,例如S=ABC,W=5,点表示空
1 | ABC.. |
现在问题是 给定长度L字符串 T,问有多少个 状态和T匹配
T中有字符_
可以匹配任意字符
l,w 3e5
5s
1024mb
我的思路
实际上滚动可以看成,S左侧W-1个点,右侧W-1个点
1 | .....S..... |
然后 用T去匹配
这匹配有点KMP的感觉,
但这里任意字符_
似乎不是很好转移
一个想法是 KMP的树状版:AC自动机能有用吗?
但实际还是,KMP中 aba 的后缀最长匹配前缀的是a
而___
的后缀最长匹配前缀是__
需要一个可以支持 通配符号的类似的 匹配算法
自匹配还算好,就是kmp的原理
dp[i]=i结尾后缀 相等的 最长前缀长度
dp[i] = dp[j] + 1, match(a[i],a[j+1]) and dp[i-1]最先递归向下到j
然而并不对
例如 样例1
1 | ABC |
对于T来说 ..___
的后缀(.___
)match的最长前缀长度为4 (..__
)
但是对于..ABC => .ABC.
转换 并不是只鉴定最后一位就可以的
也就是
1 | .ABC. |
这个match关系没有传递性
但是是必要条件,因为S的子串如果match,则可以看成T的一个特例化,而如果 特例化对应match,则非特例化一定match