time limit: 1 sec memory limit: 162 mb
submit: 6271 solved: 2673
[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
題意:給你$n$個單詞,文章長度$m$,求長度為$m$且包含至少乙個單詞的文章個數。
文章中只能出現大寫字母。
題解:求串個數的問題一般都是按長度$dp$,那麼這道題我們可以設$dp(i)$表示長度為$i$的合法文章個數。
但這題有很多個單詞,我們無法像單個單詞那樣記錄當前文章和每個單詞末尾的匹配位數,會$mle$。
此時我們需要轉化問題。注意到$ans=26^m-\$,問題就被轉化成有多少乙個單詞都不包含的文章。
這就相當於在$ac$自動機上走$m$步,不能走$end$節點的方案數。
設$dp(i,j)$表示在$ac$自動機上走了$j$步,走到$i$這個點的方案數,按遍歷順序轉移即可。
**:
#include#include#include
#include
#include
using
namespace
std;
#define maxn 6005
#define maxm 105
#define inf 0x7fffffff
#define ll long long
#define mod 10007
struct
nodetree[maxn];
ll tot=1
,dp[maxn][maxm],nxt[maxn];
bool
inq[maxn][maxm];
char
str[maxn];
inline ll read()
inline
void add(char *str)
tree[u].ise=1
;
return
;
}inline
void
get_nxt()
}return
;
}inline
void
bfs(ll m)}}
return;}
inline ll power(ll a,ll b)
return
ans;
}int
main()
JSOI2007 文字生成器
用ac自動機處理所有了解的單詞 顯然,不能直接算,直接算的話,我們需要大力容斥,複雜度不允許 我們不妨反過來做,我們根據ac自動機處理出所有的不可行解,然後用總數減去即可 計算所有不可行解用dp,f i j 表示處理到字串第i位,在自動機上第j個節點的不可行方案數,直接暴力轉移即可 include ...
JSOI2007 文字生成器
容斥原理,求出所有的情況減去不可讀的情況就是可讀的文字數了a 找不可讀文字的數量類似於病毒那一題趴我覺得 dp轉移的話.用f i j 表示當前在節點j,且串長為i時的情況 include using namespace std const int mod 1e4 7 const int n 2000...
JSOI2007 文字生成器
對於乙個長度為 n 的串 s 有多少可能情況的串 s 使得 s 的子串中至少包含乙個給定的串,給定的串有 m 個 由多模式串匹配想到ac自動機,由計數想到dp 首先建好trie圖,更新所有end標記。記 dp now st flag 表示當前正在匹配第 st 位,已確定的串匹配到了trie圖上的 n...