BZOJ 1030 文字生成器

2021-08-04 15:57:02 字數 1506 閱讀 5194

1030: [jsoi2007]文字生成器

time limit: 1 sec memory limit: 162 mb

submit: 4777 solved: 1986

[submit][status][discuss]

description

jsoi交給隊員zyx乙個任務,編制乙個稱之為「文字生成器」的電腦軟體:該軟體的使用者是一些低幼人群,

他們現在使用的是gw文字生成器v6版。該軟體可以隨機生成一些文章―――總是生成一篇長度固定且完全隨機的文

章—— 也就是說,生成的文章中每個位元組都是完全隨機的。如果一篇文章中至少包含使用者們了解的乙個單詞,

那麼我們說這篇文章是可讀的(我們稱文章a包含單詞b,當且僅當單詞b是文章a的子串)。但是,即使按照這樣的

標準,使用者現在使用的gw文字生成器v6版所生成的文章也是幾乎完全不可讀的?。zyx需要指出gw文字生成器 v6

生成的所有文字中可讀文字的數量,以便能夠成功獲得v7更新版。你能幫助他嗎?

input

輸入檔案的第一行包含兩個正整數,分別是使用者了解的單詞總數n (<= 60),gw文字生成器 v6生成的文字固

定長度m;以下n行,每一行包含乙個使用者了解的單詞。這裡所有單詞及文字的長度不會超過100,並且只可能包

含英文大寫字母a..z

output

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

sample input

2 2

a b

sample output

100

#include

#include

#include

#include

using

namespace

std;

#define maxn 10010

#define mod 10007

int n,m,ans,sz;

bool end[maxn]; char s[maxn];

int son[maxn][27],fail[maxn],f[110][maxn];

queue

q;void insert(char *s)

end[cur]=1;

}void build_fail()

}}#define ll long long

int fast_pow(int a,int b)

int main()}}

for(int i=1;i<=sz;i++)

if(!end[i]) ans+=f[m][i],ans%=mod;

int tot=fast_pow(26,m);

printf("%d\n",(tot-ans+mod)%mod);

return0;}

//f[i][j] 表示匹配到模式串上第i個位置,在ac自動機上第j

//個位置,合法的個數

//統計吧不合法的 用總數減去

bzoj 1030 文字生成器

題意 給出乙個n個單詞的字典,單詞長度 100 求長度為m的隨機字串中有多少個串至少包括乙個單詞 n 60,m 100 題解 好久沒有寫ac自動機啦,如今還記得模板真是難得 然而這似乎是trie圖?總之寫出來不差幾句話 首先至少包括乙個單詞這個條件不太好弄 那就轉化一下,求不含單詞的字串個數 然後就...

BZOJ 1030文字生成器

第一次做ac自動機 dp的題。因為前日做過一道字串dp題,這題做起來相對沒那麼困難一些。覺得一時間這題無法下手可以先試試這場div3的f題 題意 給你n個模式串,現在構造出m長度僅有26個字母的文字串,使其中至少包含1個模式串,問有多少個。思路 很容易想到dp,dpij,i表示構造到第幾位,j來列舉...

bzoj1030 文字生成器

題目鏈結 給出 n 個字串,要構造乙個長度為 m 的字串 s 使得給出的 n 個字串中至少有乙個是 s 的子串。問方案數。ac 自動機 dp 考慮至少有乙個是s的子串不好考慮。考慮用全部情況減去其中不包含任何乙個字串的情況。全部情況就是 26 m 然後考慮怎麼求出不包含任何乙個字串的情況。用 f i...