題目鏈結
題目大意:給出 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...