題意:
給出乙個n個單詞的字典,單詞長度<=100;
求長度為m的隨機字串中有多少個串至少包括乙個單詞;
n<=60,m<=100;
題解:
好久沒有寫ac自動機啦,如今還記得模板真是難得;
然而這似乎是trie圖?總之寫出來不差幾句話;
首先至少包括乙個單詞這個條件不太好弄;
那就轉化一下,求不含單詞的字串個數;
然後就想辦法處理這個;
定義狀態,f[i][j]表示長度為i的字串,最後幾位的狀態在trie圖上的結點編號;
那麼轉移顯然了:
最開始f[0][1]是1;從乙個點到下乙個點累加f;
如果目前結點代表的單詞在字典中,f值為0;
有個小坑,就是可能有單詞包括另乙個單詞,這時也要將大單詞裡的小單詞標上標記;
就是在找fail的時候順便標一下,具體可以看**;
不過**很醜= =,我反正是寫不出來比較短的ac自動機。。。
**:
#include#include#include#include#define n 128
#define m 6000
#define mod 10007
#define pr pairusing namespace std;
int next[m][26],fail[m],root=1,tot=1;
int f[n][m];
char str[n];
bool is[m];
int pow(int x,int y)
return ret;
}void insert(char *s)
is[p]=1;
}void build()
temp=fail[temp];
}if(!temp) (p?fail[p]:next[x][i])=root;
if(p) q.push(p);
} }}int main()
build();
f[0][1]=1;
for(i=1;i<=m;i++)
}} for(i=1,ans=0;i<=tot;i++)
printf("%d\n",((pow(26,m)-ans)%mod+mod)%mod);
return 0;
}
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來列舉...
bzoj1030 文字生成器
題目鏈結 給出 n 個字串,要構造乙個長度為 m 的字串 s 使得給出的 n 個字串中至少有乙個是 s 的子串。問方案數。ac 自動機 dp 考慮至少有乙個是s的子串不好考慮。考慮用全部情況減去其中不包含任何乙個字串的情況。全部情況就是 26 m 然後考慮怎麼求出不包含任何乙個字串的情況。用 f i...