【后缀自动机】CodeForces 271D Good Substrings
通道:http://codeforces.com/problemset/problem/271/D
题意:一个字符串S,然后给出每一个字符是”好‘或”坏“,求S中包含不超过k个坏字符的不同子串的个数
思路:对原串建立SAM,拓扑一下然后从后往前DP,dp[i][j]:到i节点坏字符为j个时的个数,转移为
dp[id][l] += dp[suf.c[j][id]][l];(typ[j] == '1')
dp[id][l] += dp[suf.c[j][id]][l - 1];(typ[j]=='0'),然后统计一下dp[1][i](0<i<=k)即可
代码:https://github.com/Mithril0rd/Rojo/blob/master/cf271d.cpp
TAG:简单DP+SAM