标签:2778 AC DNA matrix int void long maxn include
定义重载运算的时候一定要将矩阵初始化,因为这个调了一上午......
Code:
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<string> #define maxn 100000 typedef long long ll; using namespace std; void setIO(string a){ freopen((a+".in").c_str(),"r",stdin); } char arr[maxn]; int mod, nodes; struct matrix{ int m[105][105]; }mat; void init(matrix &c){ for(int i=0;i<=nodes;++i) c.m[i][i]=1; } void get(matrix &c) {for(int i=0;i<=nodes;++i) for(int j=0;j<=nodes;++j) c.m[i][j]=0;} void print(matrix a){ for(int i=0;i<=nodes;++i){ for(int j=0;j<=nodes;++j) printf("%d ",a.m[i][j]); printf("\n"); } } matrix operator*(matrix a,matrix b){ matrix c; get(c); for(int i=0;i<=nodes;++i) for(int j=0;j<=nodes;++j) for(int k=0;k<=nodes;++k){ c.m[i][j]+=((ll)a.m[i][k]*b.m[k][j])%mod; c.m[i][j]%=mod; } return c; } matrix power(matrix a,long long k){ matrix ans; for(int i=0;i<=nodes;++i) ans.m[i][i]=1; while(k){ if(k&1)ans=ans*a; a=a*a; k/=2; } return ans; } struct Automaton{ #define sigma 4 int get(char s){ if(s=='A') return 0; if(s=='C') return 1; if(s=='T') return 2; if(s=='G') return 3; } int ch[maxn][sigma],tag[maxn],fail[maxn]; void insert(char str[]){ int n=strlen(str); int j=0; for(int i=0;i<n;++i){ if(!ch[j][get(str[i])]) ch[j][get(str[i])]=++nodes; j=ch[j][get(str[i])]; } tag[j]=1; } queue<int>Q; void build(){ for(int i=0;i<sigma;++i) if(ch[0][i]) Q.push(ch[0][i]); while(!Q.empty()){ int u=Q.front();Q.pop(); if(tag[fail[u]]) tag[u]=1; for(int i=0;i<sigma;++i){ int r=ch[u][i]; if(!r) { ch[u][i]=ch[fail[u]][i]; continue; } fail[r]=ch[fail[u]][i]; Q.push(r); } } for(int i=0;i<=nodes;++i) for(int j=0;j<sigma;++j) if(!tag[i]&&!tag[ch[i][j]]) mat.m[i][ch[i][j]]+=1; } }aho; int main(){ //setIO("input"); mod=100000; int m, ans=0; long long n; scanf("%d%lld",&m,&n); for(int i=1;i<=m;++i)scanf("%s",arr), aho.insert(arr); aho.build(); matrix fin=power(mat,n); for(int i=0;i<=nodes;++i) ans=(ans+fin.m[0][i])%mod; printf("%d",ans); return 0; }
标签:2778,AC,DNA,matrix,int,void,long,maxn,include 来源: https://blog.51cto.com/u_15291195/3006154
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。