您的位置:首页 > 产品设计 > UI/UE

POJ 2778 DNA Sequence (AC自动机,矩阵乘法)

2016-06-02 08:14 405 查看
题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种。

思路:用AC自动机,利用AC自动机上的节点做矩阵乘法。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#define MOD 100000
char s[2005];
int ch(char x){
if (x=='A') return 0;
if (x=='C') return 1;
if (x=='G') return 2;
if (x=='T') return 3;
return -1;
}
struct Trie{
int fail[1005],next[1005][5],end[1005],L,root;
int newnode(){
for (int i=0;i<4;i++)
next[L][i]=-1;
end[L++]=-1;
return L-1;
}
void clear(){
L=0;
root=newnode();
}
void insert(char s[]){
int len=strlen(s),now=root;
for (int i=0;i<len;i++){
if (next[now][ch(s[i])]==-1) next[now][ch(s[i])]=newnode();
now=next[now][ch(s[i])];
}
end[now]=1;
}
void build(){
std::queue<int>Q;
int now;
for (int i=0;i<4;i++)
if (next[root][i]==-1)
next[root][i]=root;
else{
fail[next[root][i]]=root;
Q.push(next[root][i]);
}
while (!Q.empty()){
now=Q.front();Q.pop();
if (end[fail[now]]==1) end[now]=1;
for (int i=0;i<4;i++){
if (next[now][i]==-1) next[now][i]=next[fail[now]][i];
else{
fail[next[now][i]]=next[fail[now]][i];
Q.push(next[now][i]);
}
}
}
}
}ac;
struct Matrix{
int n,mx[105][105];
Matrix(){}
Matrix(int x){
n=x;
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
mx[i][j]=0;
}
};
Matrix operator *(Matrix a,Matrix b){
int n=a.n;
Matrix c=Matrix(n);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
for (int k=0;k<n;k++){
int tmp=(long long) a.mx[i][k]*b.mx[k][j]%MOD;
c.mx[i][j]=(c.mx[i][j]+tmp)%MOD;
}
return c;
}
Matrix powm(Matrix t,int m){
Matrix r=Matrix(t.n);
for (int i=0;i<=t.n;i++)
r.mx[i][i]=1;
while (m){
if (m%2) r=r*t;
t=t*t;
m/=2;
}
return r;
}
int main(){
int m;
int n;
while (scanf("%d%d",&n,&m)!=EOF){
ac.clear();
for (int i=0;i<n;i++){
scanf("%s",s);
ac.insert(s);
}
ac.build();
Matrix a=Matrix(ac.L);
for (int i=0;i<ac.L;i++)
for (int j=0;j<4;j++)
if (ac.end[ac.next[i][j]]==-1)
a.mx[i][ac.next[i][j]]++;
a=powm(a,m);
int ans=0;
for (int i=0;i<a.n;i++)
ans=(ans+a.mx[0][i])%MOD;
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: