poj 2778 DNA Sequence 【ac自动机 + dp + 矩阵快速幂】
2012-05-17 11:01
423 查看
这题基本上是纯模版,开始wa了,然后和模版对照了一下,居然是建fail指针的时候搞错了。。。少写了一个q.push(to)
#include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<map> #include<set> #include<cmath> #include<cassert> #include<cstring> #include<iomanip> using namespace std; #ifdef _WIN32 #define i64 __int64 #define out64 "%I64d\n" #define in64 "%I64d" #else #define i64 long long #define out64 "%lld\n" #define in64 "%lld" #endif #define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++) #define FF(i,a) for( int i = 0 ; i < (a) ; i ++) #define FFD(i,a) for( int i = (a)-1 ; i >= 0 ; i --) #define S64(a) scanf(in64,&a) #define SS(a) scanf("%d",&a) #define LL(a) ((a)<<1) #define RR(a) (((a)<<1)+1) #define pb push_back #define CL(Q) while(!Q.empty())Q.pop() #define MM(name,what) memset(name,what,sizeof(name)) #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout) const int inf = 0x3f3f3f3f; const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL; const double oo = 10e9; const double eps = 1e-10; const double pi = acos(-1.0); const int maxz = 111; const int maxc = 4; const int head = 0; const int mod = 100000; struct zz { int to[4]; int fail; bool you; }zx[maxz]; int hash[155]; string s[12]; bool vis[maxz]; i64 mx[maxz][maxz]; i64 ex[33][maxz][maxz]; vector<int>et; int n,m,use; int get() { use++; zx[use].fail = 0; zx[use].you = false; MM(zx[use].to,-1); return use; } void insert(string &p) { int now = head; int c; for(int i=0;i<p.length();i++) { c= hash[p[i]]; if(zx[now].to[c]!= -1) { now = zx[now].to[c]; } else { zx[now].to[c] = get(); now = zx[now].to[c]; } } zx[now].you = true; return ; } void ac() { queue<int>q; CL(q); q.push(head); int now,to,temp; while(!q.empty()) { now = q.front(); q.pop(); for(int i=0;i<4;i++) { if(zx[now].to[i] != -1) { to = zx[now].to[i]; temp = now; q.push(to); while(temp) { temp = zx[temp].fail; if(zx[temp].to[i] != -1) { zx[to].fail = zx[temp].to[i]; break; } } } } } return ; } bool find(int now) { if(vis[now]) return zx[now].you; vis[now] = true; if(zx[now].you) return true; if(find(zx[now].fail)) return zx[now].you = true; return false; } void ak() { int now,to; int temp; for(now=0;now<=use;now++) if(!find(now)) { for(int i=0;i<4;i++) { if(zx[now].to[i]!=-1) { to = zx[now].to[i]; } else { temp = now; while(temp) { temp = zx[temp].fail; if(zx[temp].to[i]!=-1) { temp = zx[temp].to[i]; break; } } zx[now].to[i] = temp; to = temp; } if(!find(to)) { mx[to][now] ++; } } } return ; } void gao() { for(int i=0;i<=use;i++) { for(int j=0;j<=use;j++) { ex[0][i][j] = mx[i][j]; } } i64 temp; for(int k=1;k<=et.size();k++) { for(int i=0;i<=use;i++) { for(int j=0;j<=use;j++) { temp = 0; for(int u=0;u<=use;u++) { temp += ex[k-1][i][u] * ex[k-1][u][j]; } temp %= mod; mx[i][j] = temp; } } for(int i=0;i<=use;i++) for(int j=0;j<=use;j++) { ex[k][i][j] = mx[i][j]; } } MM(mx,0); for(int i=0;i<=use;i++) { mx[i][i] = 1; } i64 tx[maxz][maxz]; for(int k=0;k<et.size();k++) { if(et[k]) { for(int i=0;i<=use;i++) { for(int j=0;j<=use;j++) { temp = 0; for(int u=0;u<=use;u++) { temp += mx[i][u]*ex[k][u][j]; } temp %= mod; tx[i][j] = temp; } } for(int i=0;i<=use;i++) for(int j=0;j<=use;j++) { mx[i][j] = tx[i][j]; } } } return ; } int start() { MM(vis,false); vis[0]= true; MM(mx,0); ac(); ak(); et.clear(); while(n) { et.push_back(n%2); n /= 2; } gao(); i64 ans = 0; for(int i=0;i<=use;i++) { ans += mx[i][0]; ans%=mod; } ans %= mod; return ans; } int main() { hash['A'] = 0; hash['C'] = 1; hash['T'] = 2; hash['G'] = 3; cin>>m>>n; use = -1; get(); for(int i=1;i<=m;i++) { cin>>s[i]; insert(s[i]); } cout<<start()<<endl; return 0; }
相关文章推荐
- POJ 2778 DNA Sequence [AC自动机 + 矩阵快速幂]
- POJ 2778 DNA Sequence (AC自动机 + 矩阵快速幂)
- POJ 2778 - DNA Sequence (AC自动机 矩阵快速幂)
- poj 2778 DNA Sequence(AC自动机 + 矩阵快速幂)
- POJ 题目2778 DNA Sequence(AC自动机,矩阵快速幂)
- POJ 2778 DNA Sequence [AC自动机 + 矩阵快速幂]
- POJ 2778 DNA Sequence && AC自动机 矩阵 矩阵加速
- POJ - 2778_DNA Sequence_AC自动机&&矩阵快速幂
- poj -- 2778 DNA Sequence && hdu -- 2243 考研路茫茫——单词情结(AC自动机 + 矩阵)
- poj 2778 DNA Sequence 【AC自动机 + 矩阵加速】
- POJ2778 DNA sequence[自动AC机&矩阵快速幂]
- POJ 2778 DNA Sequence(AC自动机 + 矩阵乘法)
- POJ 2778 DNA Sequence [AC自动机 矩阵乘法]
- POJ 2778 DNA Sequence (AC自动机,矩阵乘法)
- POJ 2778 (AC自动机 矩阵快速幂)
- [poj2778 DNA Sequence]AC自动机,矩阵快速幂
- poj 2778 AC自动机 + 矩阵快速幂
- AC自动机专题——G - DNA Sequence POJ - 2778 矩阵快速幂+AC自动机
- POJ 2778 DNA Sequence(自动机+矩阵)
- POJ 2778 DNA Sequence (AC 自动机+矩阵)