1030 JSOI2007 文字生成器

2021-08-06 06:42:07 字數 991 閱讀 1040

題目鏈結

題目大意:給出 n 個長度不超過 l 的字串,求有多少長度為 m 的字串 含有至少乙個之前給到的字串,字符集大小為 26

題解:至少1個提示我們使用補集轉化……總數明顯是26^m,現在計算有多少字串不含有任何乙個給出的字串

將給出字串建成ac自動機,然後標記所有結尾結點,及fail指標指向結尾結點的點,以後用到路徑時不考慮含有這些點的邊 f[

i][j

]表示考

慮到了第

i個字元

,當前在

ac自動

機上第j

個結點的

方案數

f[i][c[

j][k

]]+=

f[i−

1][j

] a

ns=∑

f[m]

[i]

我的收穫:至少乙個->補集轉化

#include 

#include

#include

#include

using

namespace

std;

#define idx s[i]-'a'

const

int mn=6000,mm=105,p=10007;

int n,m,f[mm][mn],sum=1,ans;char s[mn];

struct ac_dfa

dang[x]=1;

}void getfail()

}void work()

for(int i=0;i<=tot;i++) if (!dang[i]) ans+=f[m][i];

for(int i=1;i<=m;i++) sum=(sum*26)%p;

printf("%d\n",((sum-ans)%p+p)%p);

}}t;void init()

int main()

1030 JSOI2007 文字生成器

分析 ac自動機 dp。正難則反,求滿足的,可以求出不滿足的,用總的減去。所以考慮如何就出所有的長度為m的串裡,沒有出現任何乙個單詞的個數。建立ac自動機,然後會有一些點是一定不能走的,這些點要麼是某些單詞的結尾,或者是包含了某些單詞 以它結尾的串的字尾是乙個單詞 然後f i j 表示當前有i位,在...

1030 JSOI2007 文字生成器

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

BZOJ1030 JSOI2007文字生成器

比起前面hnoi的gt考試,貌似這題是多模式串。然後我滾去學ac自動機了。發現還是很好寫的。ac自動機部分見筆記 搞出自動機之後,f i j 表示自動機上第i個節點匹配到第j個字元不可讀文字的數量,然後自己yy一下轉移 include include include define n 10005 d...