bzoj 1030 JSOI2007 文字生成器

2022-05-25 17:54:08 字數 1060 閱讀 7650

在ac自動機上做dp

dp[i][j]表示在字串裡(文章)中第i個位置在自動機中第j個狀態的方案數

當sh[j].son[k]是乙個單詞的結尾時,則累計答案,此時i右邊的字元都可以在a~z中任意選擇,不轉移到下乙個狀態

若不是單詞的結尾,則轉移到下乙個狀態。

是否是單詞的結尾需要注意,並不只是在加到字典樹時最後乙個位置,還有其他能以fail指標指到這裡的狀態

這是因為若當前的狀態失配,則可以直接轉移的乙個單詞的結尾,符合題目條件。

#include #define ll long long

#define mod 10007

using

namespace

std;

ll n,m,dp[

110][6100

],w,ans;

ll c[

200];

char a[200

];struct

node

sh[6100

];void build(char

a) p=sh[p].son[num];

if (i==sz)

sh[p].t=1

; }

}void

build_fail()//廣搜求fail

else}}

}int

main()

dp[0][1]=1

; build_fail();

c[0]=1

;

for (int i=1;i<=m+10;i++)

c[i]=(c[i-1]*26)%mod;

for (int i=0;i)

dp[i+1][sh[j].son[k]]=(dp[i+1][sh[j].son[k]]+dp[i][j])%mod;//轉移}}

}printf(

"%lld\n

",ans%mod);

}

BZOJ1030 JSOI2007文字生成器

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

bzoj1030 JSOI2007 文字生成器

傳送門 思路 直接算好像比較困難,所以考慮先算不可讀的串的個數,再拿總串數去減。不可讀的串的數量就是在ac自動機上走m步而不經過結尾節點 包括結尾點和fail指向結尾點的節點 的路徑條數。這個怎麼求呢?設f i j 表示走i步,現在在j號節點的路徑條數。那麼f i j 可以轉移f i 1 son j...

bzoj1030 JSOI2007 文字生成器

time limit 1 sec memory limit 162 mb submit 2891 solved 1193 submit status discuss jsoi交給隊員zyx乙個任務,編制乙個稱之為 文字生成器 的電腦軟體 該軟體的使用者是一些低幼人群,他們現在使用的是gw文字生成器v...