poj 1625 Censored!(AC自动机+DP+高精)

题意:要生成一个长度为M的串,有P个“禁止串”,即不能在生成的串中出现,问生成这样的串的个数。

思路:用所有“禁止串”建立AC自动机,对于所有节点,我们可以知道添加一个字符是否会不合法,通过这个进行dp,用dp[i][j]表示,长度为i的串,处在状态j,那么dp[i][ch[j][c]]=add(dp[i][ch[j][c]],dp[i-1][j]); c为添加的字符。由于结果非常大,需要高精……非常坑爹的是,我高高兴兴写完了,结果无限wa,最终的结果居然是数组开小了!我就不明白为何网上的代码基本都开的110就能过,我就要开到150才能过……简直无语啊。


代码:


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=150+10;
const int mod=10000;
int ch[150][55],next[150],flag[150],size;
int indx[1000],N,M,P;
char str[maxn];
void Init()
{
    memset(flag,0,sizeof(flag));
    memset(ch[0],0,sizeof(ch[0]));
    memset(next,0,sizeof(next));
    size=0;flag[0]=0;
}
void Insert(char *s)
{
    int u=0,n=strlen(s);
    for(int i=0;iq;
    for(int i=0;i=0;--i)
            printf("%04d",num[i]);
        printf("\n");
    }
}dp[55][maxn];
BigInt add(BigInt  a,BigInt  b)
{
    int n=max(a.len,b.len);
    BigInt c;
    c.Clear();
    for(int i=0;i



你可能感兴趣的:(字符串)