bzoj1030 JSOI2007 文字生成器

2022-03-18 11:43:07 字數 869 閱讀 5557

bzoj1030[jsoi2007]文字生成器

題意:給出乙個字典和乙個長度,要求有多少個這個長度的字串裡含有子串為字典裡的單詞。字串和字典裡的字元都為大寫字母。單詞數≤60,字串及單詞長度≤100。

題解:在ac自動機上跑dp,求不含字典單詞的個數,再用總個數減。f[i][j]表示當前處理第i個位置,在trie上的節點為j。f[i][j]=sum,x為j的fail祖先,為k為大寫字母,不能走到val為1的節點。注意val的處理,特別是getfail中的「if(val[ch[y][i]])val[ch[x][i]]=1;」一句。

**:

1 #include 2 #include 3 #include 4 #include 5

#define maxn 10000

6#define inc(i,j,k) for(int i=j;i<=k;i++)

7#define mod 10007

8using

namespace

std;910

int n,m,sz,ch[maxn][26],fail[maxn],ans,f[150][maxn]; bool

val[maxn];

11void insert(char *s)

13 val[x]=1;14

}15 queue q;

16void

getfail()24}

25}26char str[150

];27

intmain()34}

35 inc(i,0,sz)if(!val[i])

38 printf("

%d",ans); return0;

39 }

20160621

BZOJ1030 JSOI2007文字生成器

比起前面hnoi的gt考試,貌似這題是多模式串。然後我滾去學ac自動機了。發現還是很好寫的。ac自動機部分見筆記 搞出自動機之後,f i j 表示自動機上第i個節點匹配到第j個字元不可讀文字的數量,然後自己yy一下轉移 include include include define n 10005 d...

bzoj1030 JSOI2007 文字生成器

傳送門 思路 直接算好像比較困難,所以考慮先算不可讀的串的個數,再拿總串數去減。不可讀的串的數量就是在ac自動機上走m步而不經過結尾節點 包括結尾點和fail指向結尾點的節點 的路徑條數。這個怎麼求呢?設f i j 表示走i步,現在在j號節點的路徑條數。那麼f i j 可以轉移f i 1 son j...

bzoj1030 JSOI2007 文字生成器

time limit 1 sec memory limit 162 mb submit 2891 solved 1193 submit status discuss jsoi交給隊員zyx乙個任務,編制乙個稱之為 文字生成器 的電腦軟體 該軟體的使用者是一些低幼人群,他們現在使用的是gw文字生成器v...