BZOJ1030 JSOI2007 文字生成器

2022-06-02 20:03:09 字數 1623 閱讀 7270

time limit: 1 sec  memory limit: 162 mb submit: 5025  solved: 2080 [submit][status][discuss]

jsoi交給隊員zyx乙個任務,編制乙個稱之為「文字生成器」的電腦軟體:該軟體的使用者是一些低幼人群, 他們現在使用的是gw文字生成器v6版。該軟體可以隨機生成一些文章―――總是生成一篇長度固定且完全隨機的文 章—— 也就是說,生成的文章中每個位元組都是完全隨機的。如果一篇文章中至少包含使用者們了解的乙個單詞, 那麼我們說這篇文章是可讀的(我們稱文章a包含單詞b,當且僅當單詞b是文章a的子串)。但是,即使按照這樣的 標準,使用者現在使用的gw文字生成器v6版所生成的文章也是幾乎完全不可讀的?。zyx需要指出gw文字生成器 v6 生成的所有文字中可讀文字的數量,以便能夠成功獲得v7更新版。你能幫助他嗎?

輸入檔案的第一行包含兩個正整數,分別是使用者了解的單詞總數n (<= 60),gw文字生成器 v6生成的文字固 定長度m;以下n行,每一行包含乙個使用者了解的單詞。這裡所有單詞及文字的長度不會超過100,並且只可能包 含英文大寫字母a..z

乙個整數,表示可能的文章總數。只需要知道結果模10007的值。

2 2a

b100 

構造ac自動機,對於單詞的結尾打上標記,且對於fail指標有標記的也要打上標記

設$f[i][j]$為還剩$i$步沒走,且當前走到了$j$的合法方案數,我寫的記憶化搜尋

#include #include 

#include

using

namespace

std;

const

int mod = 10007

;const

int maxn = 6000 + 10

;int root, cnt, son[maxn][26] = , fail[maxn] = ;

bool mark[maxn] = ;

inline

void insert(char *s)

mark[p] = true;}

queue

q;inline

void

setfail()

q.push(son[u][i]);

v =fail[u];

fail[son[u][i]] =son[v][i];

if(mark[son[v][i]]) mark[son[u][i]] = true

; }

}}int f[100 + 10

][maxn];

int dp(int res, int

u)

return

ret;

}int

main()

setfail();

memset(f, -1, sizeof

f);

int ans = dp(m, root), tot = 1

;

for(int i = 1; i <= m; i++) tot = tot * 26 %mod;

printf(

"%d\n

", (tot - ans + mod) %mod);

return0;

}

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...