BZOJ1030 AC自动机 + DP

题目大意:给定若干个字符串,问长度为m并且至少包含一个之前给定的字符串的字符串有几种?

题目解析:考虑补集,dp[i][j]为当前第i位,停留在第j个tire节点上的数目,转移的话看下一个字符存不存在,不存在就一直找fai节点,注意danger;

#include
#include
#include
#define mod 10007
using namespace std;
int n,m,sz=1,ans1,ans2=1;
int tire[6001][27],fail[6001],q[6001],dp[101][6001];
char s[101];
bool danger[6001];
void init()
{
    memset(dp,0,sizeof(dp));
    memset(tire,0,sizeof(tire));
    memset(danger,false,sizeof(danger));
    for(int i=1;i<=26;i++)tire[0][i]=1;
}
void ins()
{
	int now=1,c;
	for(int i=0;i

 

你可能感兴趣的:(AC自动机)