【后缀自动机】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

posted @ 2014-10-17 21:06  mithrilhan  阅读(183)  评论(0编辑  收藏  举报