博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JSOI2007] 文本生成器
阅读量:4977 次
发布时间:2019-06-12

本文共 1698 字,大约阅读时间需要 5 分钟。

Trie图版的?

先建个trie图,如果trie上某节点的前缀上有标记,那这个点也不能走。

1 #include
2 #include
3 #include
4 #include
5 #define mod 10007 6 using namespace std; 7 8 int n,m,ans; 9 char str[105];10 int s[6005][30],tc;11 int ed[6005],fal[6005];12 13 void ins()14 {15 scanf("%s",str+1);16 int p=0;17 int l=strlen(str+1);18 for(int i=1;i<=l;i++)19 {20 int c=str[i]-'A'+1;21 if(!s[p][c])s[p][c]=++tc;22 p=s[p][c];23 }24 ed[p]++;25 }26 27 queue
qq;28 29 void build()30 {31 qq.push(0);32 while(!qq.empty())33 {34 int p=qq.front();35 qq.pop();36 for(int i=1;i<=26;i++)37 {38 int lf=(!p)?0:s[fal[p]][i];39 if(s[p][i])40 {41 fal[s[p][i]]=lf;42 qq.push(s[p][i]);43 ed[s[p][i]]|=ed[fal[s[p][i]]];44 }45 else s[p][i]=lf;46 }47 }48 }49 50 int f[105][6005];51 52 int main()53 {54 scanf("%d%d",&n,&m);55 for(int i=1;i<=n;i++)ins();56 build();57 f[0][0]=1;58 for(int i=1;i<=m;i++)59 {60 for(int j=0;j<=tc;j++)61 {62 if(!f[i-1][j])continue;63 for(int k=1;k<=26;k++)64 {65 if(!ed[s[j][k]])66 f[i][s[j][k]]=(f[i][s[j][k]]+f[i-1][j])%mod;67 }68 }69 }70 for(int i=0;i<=tc;i++)ans=(ans+f[m][i])%mod;71 int tot=1;72 for(int i=1;i<=m;i++)tot=(tot*26)%mod;73 printf("%d",((tot-ans)%mod+mod)%mod);74 return 0;75 }

 

转载于:https://www.cnblogs.com/eternhope/p/9691208.html

你可能感兴趣的文章
jquery easyui datagrid 如何第一次点击列标题时是降序排列
查看>>
第二周学习总结
查看>>
第二次实验
查看>>
【Java架构:基础技术】一篇文章搞掂:MyBatis
查看>>
room-views-用窗口颜色清除背景(Clear Background with Window Colour)选项
查看>>
OCR识别
查看>>
MySQL 性能调优的10个方法
查看>>
移动端单指拖 双值旋转缩放(改动版)
查看>>
经常使用排序算法时间复杂度和空间复杂度简析
查看>>
在 CentOS 6 上安装 PHP 5.4.30
查看>>
介绍 32 位和 64 位版本的 Microsoft Office 2010
查看>>
Python使用inspect查看代码参数
查看>>
jvisualvm远程监控Tomcat
查看>>
类就是类型,类型就是类
查看>>
修改Windows中文用户名为英文(更全面的方法)
查看>>
mysql主从复制
查看>>
jloi2017(shoi2017?)六省联考酱油记
查看>>
【bzoj1786】[Ahoi2008]Pair 配对 dp
查看>>
inner join, left join, right join, full outer join的区别
查看>>
边工作边刷题:70天一遍leetcode: day 61
查看>>