http://poj.org/problem?id=2778

有空再又一次做下,对状态图的理解非常重要

题解:
http://blog.csdn.net/morgan_xww/article/details/7834801

另外做了矩阵幂的模板:

//ac.sz是矩阵的大小
void mulmtr(long long x[MAXNODE][MAXNODE],long long y[MAXNODE][MAXNODE])//y=x*y
{ll tmp[MAXNODE][MAXNODE];for(int i=0;i<ac.sz;i++){for(int j=0;j<ac.sz;j++){tmp[i][j]=0;for(int k=0;k<ac.sz;k++)tmp[i][j] +=x[i][k]*y[k][j];tmp[i][j] %=MOD;}}for(int i=0;i<ac.sz;i++)for(int j=0;j<ac.sz;j++)y[i][j]=tmp[i][j];
}
void Mtrmi(ll mtr[MAXNODE][MAXNODE],int n)
{for(int i=0;i<ac.sz;i++){for(int j=0;j<ac.sz;j++){if(i == j)ans[i][j]=1;//E矩阵else ans[i][j]=0;}}while(n){if(n&1){mulmtr(mtr,ans);}mulmtr(mtr,mtr);n/=2;}
}

代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <queue>
#include <iostream>
using namespace std;#define ll long longconst int MAXNODE  = 15*15;
const int SSIZE  = 2000000000+100;
const int MOD = 100000;
const int SIGMA_SIZE = 4;
const int SIZE = 20;ll mtr[MAXNODE][MAXNODE];
ll ans[MAXNODE][MAXNODE];
int danger[MAXNODE];struct AC
{int f[MAXNODE];int val[MAXNODE];int last[MAXNODE];int cnt[MAXNODE];int ch[MAXNODE][SIGMA_SIZE];int sz;void init(){memset(ch[0],0,sizeof(ch[0]));memset(cnt,0,sizeof(cnt));f[0]=0;///sz=1;}inline int idx(char x){if(x == 'A')return 0;if(x == 'T')return 1;if(x == 'C')return 2;if(x == 'G')return 3;}void insert(char *s, int v){int n=strlen(s),u=0;for(int i=0;i<n;i++){int id= idx(s[i]);if(!ch[u][id]){memset(ch[sz],0,sizeof(ch[sz]));val[sz]=0;ch[u][id]=sz++;}u=ch[u][id];}val[u]=v;danger[u]=1;}void getfail(){queue<int>q;f[0]=0;for(int c=0;c<SIGMA_SIZE;c++){int u=ch[0][c];if(u){q.push(u);f[u]=0;last[u]=0;}}while(!q.empty()){int r=q.front();q.pop();for(int c=0;c<SIGMA_SIZE;c++){int u=ch[r][c];//if(!u)continue;if(!u){ch[r][c]=ch[f[r]][c];//continue;}q.push(u);int v=f[r];while(v &&!ch[v][c])v=f[v];f[u]=ch[v][c];//last[u]=val[f[u]]?f[u]:last[f[u]];danger[u] |= danger[f[u]];}}}
};
void init()
{memset(mtr,0,sizeof(mtr));memset(danger,0,sizeof(danger));
}AC ac;char str[SIZE];void mulmtr(long long x[MAXNODE][MAXNODE],long long y[MAXNODE][MAXNODE])//y=x*y
{ll tmp[MAXNODE][MAXNODE];for(int i=0;i<ac.sz;i++){for(int j=0;j<ac.sz;j++){tmp[i][j]=0;for(int k=0;k<ac.sz;k++)tmp[i][j] +=x[i][k]*y[k][j];tmp[i][j] %=MOD;}}for(int i=0;i<ac.sz;i++)for(int j=0;j<ac.sz;j++)y[i][j]=tmp[i][j];
}
void Mtrmi(ll mtr[MAXNODE][MAXNODE],int n)
{for(int i=0;i<ac.sz;i++){for(int j=0;j<ac.sz;j++){if(i == j)ans[i][j]=1;//E矩阵else ans[i][j]=0;}}while(n){if(n&1){mulmtr(mtr,ans);}mulmtr(mtr,mtr);n/=2;}
}int main()
{//freopen("poj2788.txt","r",stdin);int n,m;while(~scanf("%d%d",&m,&n)){init();ac.init();for(int i=1;i<=m;i++){scanf("%s",str);ac.insert(str,i);}ac.getfail();for(int i=0;i<ac.sz;i++)if(!danger[i])for(int j=0;j<4;j++)if(!danger[ac.ch[i][j]]){mtr[i][ac.ch[i][j]]++;}Mtrmi(mtr,n);//* for(int i=0;i<ac.sz;i++){for(int j=0;j<ac.sz;j++)printf("%lld|%lld ",mtr[i][j],ans[i][j]);putchar('\n');}*////for(int i=1;i<ac.sz;i++)ans[0][0]+=ans[0][i]%MOD;printf("%I64d\n",ans[0][0]%MOD);}return 0;
}

POJ 2778 AC自己主动机+矩阵幂 不错的题相关推荐

  1. POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)

    题目链接:Censored! 解析:AC自己主动机 + 高精度 + 简单DP. 字符有可能会超过128.用map映射一下就可以. 中间的数太大.得上高精度. 用矩阵高速幂会超时,简单的DP就能解决时间 ...

  2. HDU 2896 病毒侵袭 AC自己主动机题解

    本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...

  3. Hdu 3341 Lost#39;s revenge (ac+自己主动机dp+hash)

    标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...

  4. uva 11468 - Substring(AC自己主动机+概率)

    题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...

  5. hdu 2222 Keywords Search ac自己主动机

    点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  6. Codeforces 86C Genetic engineering (AC自己主动机+dp)

    题目大意: 要求构造一个串,使得这个串是由所给的串相连接构成,连接能够有重叠的部分. 思路分析: 首先用所给的串建立自己主动机,每一个单词节点记录当前节点可以达到的最长后缀. 開始的时候想的是dp[i ...

  7. poj 2778 AC自动机+矩阵快速幂

    题目链接:https://vjudge.net/problem/POJ-2778 题意:输入n和m表示n个病毒,和一个长为m的字符串,里面只可以有'A','C','G','T' 这四个字符,现在问这个 ...

  8. HDU 3695 Computer Virus on Planet Pandora (AC自己主动机)

    题意:有n种病毒序列(字符串),一个模式串,问这个字符串包括几种病毒. 包括相反的病毒也算.字符串中[qx]表示有q个x字符.具体见案列. 0 < q <= 5,000,000尽然不会超, ...

  9. poj 2778 DNA Sequence

    http://poj.org/problem?id=2778 AC自动机 + 矩阵连乘 代码: #include<iostream> #include<cmath> #incl ...

最新文章

  1. php服务器日志在哪里看,云服务器日志在哪里看
  2. Unity Time的使用
  3. 大数据成败之“监”:美团数据质量监管平台这样搭建
  4. linux LD_LIBRARY_PATH环境变量
  5. 小程序 返回多条图文,类似新闻或者博客的展示,其中遇到的bug
  6. 大型企业网络配置系列课程详解(第一版)发布
  7. 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
  8. 收集一些实用的电脑使用习惯和操作技巧
  9. php表单提交完返回,表单内容不清空解决方法
  10. JMetro 5.2版发布
  11. 字节跳动的一面内容记录
  12. 使用Thumbnailator处理gif图片时遇到java.lang.ArrayIndexOutOfBoundsException: 4096异常处理
  13. 自动避障算法c语言,基于单片机的自动避障小车设计与实现报告.doc
  14. 新概念英语第二册课文电子版_新概念英语第二册:课文+音频+教学视频合集(可下载)...
  15. 关于EF Core中同一个实体被多次tracked的问题
  16. C++核心准则​Pro.bounds:边界安全群组
  17. WFP 样式(复习用)
  18. 计算机三维设计ppt,1 三维建模技术发展史.ppt
  19. Android作业批改系统(后台管理+前台app)
  20. Java简简单单抢红包小程序(代码)

热门文章

  1. convertViewsetTag方法的一点理解
  2. Android UI Button 和GridView 的设计--优化(2)
  3. 路由器互联端口处于不同网段的路由方法和原理
  4. 当移动数据分析需求遇到Quick BI
  5. Fiddler抓包工具总结(转)
  6. 第5章 图像分类的数据集
  7. SSM框架之批量增加示例(同步请求jsp视图解析)
  8. ASP.NET页面之间传递值的几种方式
  9. vue-cli 使用小技巧
  10. 从外部导入django模块