bzoj1030 文字生成器

2022-04-10 05:20:46 字數 1219 閱讀 3128

題目鏈結

給出\(n\)個字串,要構造乙個長度為\(m\)的字串\(s\),使得給出的\(n\)個字串中至少有乙個是\(s\)的子串。問方案數。

\(ac\)自動機+\(dp\)

考慮至少有乙個是s的子串不好考慮。考慮用全部情況減去其中不包含任何乙個字串的情況。

全部情況就是\(26^m\),然後考慮怎麼求出不包含任何乙個字串的情況。

用\(f[i][j]\)表示已經確定了\(i\)個字元,現在到了\(ac\)自動機的j位置的方案數。

顯然如果\(j\)位置是給出字串的結尾或者沿著\(fail\)指標可以跳到給出字串的結尾,那麼就不能轉移。其他的就可以轉移到\(f[i + 1][k]\)。\(k\)是\(j\)在\(ac\)自動機上的乙個兒子。

最後答案就是\(26^m-\sum\limits_^f[m][i](i不是給出字串的結尾)\)

/*

* @author: wxyww

* @date: 2019-02-01 19:33:15

* @last modified time: 2019-02-01 20:04:44

*/#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n = 6000 + 10,mod = 10007;

ll read()

while(c>='0'&&c<='9')

return x*f;

}char s[110];

queueq;

int trie[n][27],bz[n],fail[n],tot;

void ins()

bz[now] = 1;

}void get_fail() }}

int qm(int x,int y)

return ans;

}int f[n][n];

int main()

get_fail();

f[0][0] = 1;

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

} }int ans = qm(26,m);

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

cout

}

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來列舉...