BZOJ 1030 文字生成器 AC自動機 dp

2021-08-08 17:35:27 字數 2499 閱讀 8254

題目描述

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 2

ab

樣例輸出

100

題解:這真是一道神題+好題,首先直接求方案總數非常困難,那就有一種思想,既然直接求解很困難,那就用總方案數-不合法的方案數即合法方案數。對於每乙個位置放什麼數的方案數可以有上乙個位置的方案數轉移過來,所以用動態規劃。dp【i】【j】表示第i個位置放a~z的數且在trid樹上的j位置的方案數。狀態轉移方程不太好直接書寫,直接看**(其實還是很好理解的)。氣的是**怎麼都過不了老是wa最後一兩個點,本地對拍了好久,極限資料也測了,都沒有錯,哎,果然蒟蒻。

總結:補集的思想一定要有,當以後遇到求合法的方案數時,如果直接求解有點困難,可以考慮(總方案數-不合法方案數)。

90分**(my):

#include #include #include #include #include #define n 1005

#define mod 10007

using namespace std;

int n,m,st;

char str[n];

queueq;

int tot=1;

int date[6000][26],fail[10000],cnt[10000],dp[105][10000];

void build()

q.push(date[re][i]);

fail[date[re][i]]=date[fail[re]][i];

cnt[date[re][i]]|=cnt[date[fail[re]][i]];

} }}int cal(int a,int x)

return ans;

}int main()

cnt[t]=1;

} build();

dp[0][1]=1;

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

}} }

int ans=0;

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

if(!cnt[i])

ans=(ans+dp[m][i])%mod;

printf("%d\n",(cal(26,m)-ans+2*mod)%mod);

return 0;

}

ac**(gxz大佬)

#include #include #include #define mod 10007

using namespace std;

queueq;

int nt[6001][26] , fail[6001] , cnt[6001] , tot = 1 , f[101][6001];

char str[61];

int qpow(int x , int y)

return ans;

}void build()}}

}int main()

cnt[t] = 1;

}build();

f[0][1] = 1;

for(i = 1 ; i <= m ; i ++ )}}

}for(i = 1 ; i <= tot ; i ++ )

if(!cnt[i])

ans = (ans + f[m][i]) % mod;

printf("%d\n" , (qpow(26 , m) - ans + 2 * mod) % mod);

return 0;

}

bzoj 1030 文字生成器

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

BZOJ 1030 文字生成器

1030 jsoi2007 文字生成器 time limit 1 sec memory limit 162 mb submit 4777 solved 1986 submit status discuss description jsoi交給隊員zyx乙個任務,編制乙個稱之為 文字生成器 的電腦軟體...

BZOJ 1030文字生成器

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