网站大量收购独家精品文档,联系QQ:2885784924

6.3知识精炼(二)高清版本.pdf

6.3知识精炼(二)高清版本.pdf

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

知识精炼(二)

主讲人:邓哲也

BZOJ1030文本生成器

给定n个小串,构造一个长度为m的大串。

一个串合法当且仅当包含至少一个小串。

问合法串的数目。

N≤60,所有文本长度都不会超过100,只含有大写字母。

样例输入:

22

A

B

样例输出:

100

BZOJ1030文本生成器

把所有的小串插入AC自动机。

对于AC自动机的节点,计算出从根到每个节点是否会经过

至少一个小串,然后在上面dp即可。

f[v][n][x]:

v=1当前经过至少一个小串,v=0表示没有

n表示当前构造的串长

x表示现在在AC自动机的x节点上

BZOJ1030文本生成器

首先计算出cnt[x]表示AC自动机上从根走到x的路径

上是否会经过至少一个小串。

这个可以在BFS计算fail指针的时候计算。

BZOJ1030文本生成器

插入Trie树:

for(inti=1;i=n;i++){

scanf(“%s”,s);

intx=0;

for(intj=0;s[j];j++){

if(!ch[x][s[j]-‘A’])ch[x][s[j]-‘A’]=

tot++;

x=ch[x][s[j]-‘A’];

}

cnt[x]=1;

}

BZOJ1030文本生成器

BFS遍历求next指针:

ints=0,e=1;

q[0]=next[0]=0;

while(se){

intx=q[s++];

cnt[x]|=cnt[next[x]];

for(intj=0;j26;j++)

if(ch[x][j]){

q[e++]=ch[x][j];

next[ch[x][j]]=(!x)?0:ch[next[x]][j];

}elsech[x][j]=ch[next[x]][j];

}

BZOJ1030文本生成器

看f[v][n][x]可以转移到哪些节点:

对于26条出边:x-next[x][k](0≤k≤25)

记y=next[x][k]

f[v|cnt[y]][n+1][y]+=f[v][n][y]

BZOJ1030文本生成器

DP统计:

f[0][0][0]=1;

for(inti=0;im;i++)

for(into=0;o=1;o++)

for(intj=0;jtot;j++)

if(f[o][i][j])

for(intk=0;k26;k++){

intx=ch[j][k];

f[o|cnt[x]][i+1][x]=(f[o|cnt[x]][i+1][x]+f[o][i][j])

%10007;

}

BZOJ1030文本生成器

统计答案:

intans=0;

for(inti=0;itot;i++)

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

时间复杂度O(26mL),L为所有字符串的长度之和。

B

您可能关注的文档

文档评论(0)

133****9720 + 关注
实名认证
内容提供者

物业管理师证持证人

该用户很懒,什么也没介绍

领域认证该用户于2023年04月23日上传了物业管理师证

1亿VIP精品文档

相关文档