bzoj 1030 文字生成器

2021-07-04 21:55:46 字數 1267 閱讀 8473

題意:

給出乙個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...