Luogu P3311數數(AC自動機上DP)

2022-05-01 01:09:11 字數 1652 閱讀 4881

題目鏈結

蒟蒻今天終於學會了ac自動機,感覺很穩

(後一句愚人節快樂)

這題開乙個f[i][j][k]表示有沒有受到限制,正在列舉第j位,來到了ac自動機的第k個節點

的方案數

隨後可以刷表更新

注意如果是在列舉第一位的話注意前導0

#include#include

#include

#include

#include

#include

#define maxl 2000

#define maxu 10

#define mod 1000000007

using

namespace

std;

inline

long

long

read()

while

(isdigit(ch))

return num*f;

}inline

int count(int i)

int tree[maxl*maxu][maxu];

int fail[maxl*maxu];

int val[maxl*maxu];

inttot;

char

c[maxl];

char

s[maxl];

long

long f[3

][maxl][maxl];

bool

vis[maxl];

void

update()

val[now]++;

return;}

void

makefail()

fail[tree[

from][i]]=tree[fail[from

]][i];

val[tree[

from][i]]|=val[tree[fail[from

]][i]];

q.push(tree[

from

][i]);}}

return;}

inline

void add(long

long &a,int

b)int

main()

long

long ans=0

; makefail();

for(int i=0;ii)

for(int j=0;j<=tot;++j)

int nxt=tree[j][now];

if(val[nxt]==0) add(f[0][i+1][nxt],f[0

][i][j]);

}if(f[1

][i][j])

}if(j==0

)

int nxt=tree[j][now];

if(val[nxt]==0) add(f[0][i+1][nxt],1

); }

else}}

}for(int i=0;i<=tot;++i)

ans=(ans+mod)%mod;

printf(

"%lld\n

",ans);

}

BZOJ1030 AC自動機上的DP

description jsoi交給隊員zyx乙個任務,編制乙個稱之為 文字生成器 的電腦軟體 該軟體的使用者是一些低幼人群,他們現在使用的是gw文字生成器v6版。該軟體可以隨機生成一些文章 總是生成一篇長度固定且完全隨機的文章 也就是說,生成的文章中每個位元組都是完全隨機的。如果一篇文章中至少包含...

BZOJ3530 數數(AC自動機,動態規劃)

bzoj 很套路的ac 自動機 dp 首先,如果長度小於n 就不存在任何限制 直接大力dp 然後強制限制不能走到帶有標記的點上面 如果長度恰好為 n 的長度 那麼,要考慮是否恰好卡在範圍裡面 於是d p狀態多記一維 表示是否卡在範圍裡面 最後求一下和就行啦 include include inclu...

BZOJ3530 數數(AC自動機,動態規劃)

bzoj 很套路的 ac 自動機 dp 首先,如果長度小於 n 就不存在任何限制 直接大力 dp 然後強制限制不能走到帶有標記的點上面 如果長度恰好為 n 的長度 那麼,要考慮是否恰好卡在範圍裡面 於是 dp 狀態多記一維 表示是否卡在範圍裡面 最後求一下和就行啦 include include i...