zoukankan      html  css  js  c++  java
  • poj2778:DNA Sequence

    文本生成器加强版。用矩阵加速。(一直tle居然是因为

    node operator*(const node&o)const{
         node tmp;
         REP(i,0,pt) REP(j,0,pt) REP(k,0,pt) {
    	 int temp=(ll)a[i][k]*o.a[k][j]%mod;
    	 tmp.a[i][j]=(tmp.a[i][j]+temp)%mod;
         }
         return tmp;
    }
    tmp.a[i][j]=(tmp.a[i][j]+((ll)a[i][k]*o.a[k][j])%mod)%mod(TLE)

    然而并不明白是为什么QAQ。ccz大爷说是longlong取模慢,而且强制把int转成了longlong。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define REP(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define clr(x,c) memset(x,c,sizeof(x))
    #define ll long long
    const int nmax=105;
    const int mod=100000;
    int ch[nmax][4],fail[nmax];
    bool F[nmax];
    char s[15];
    int n,m,pt=0;
    int id(char c){
    	switch(c){
    		case 'A':
    			return 0;break;
    		case 'C':
    			return 1;break;
    		case 'G':
    			return 2;break;
    		case 'T':
    			return 3;break;
    	}
    }
    void insert(char s[]){
    	int t=0,len=strlen(s);
    	for(int i=0;i<len;i++){
    		if(!ch[t][id(s[i])]) ch[t][id(s[i])]=++pt;
    		t=ch[t][id(s[i])];
    	}
    	F[t]=true;
    }
    queue<int>q;
    void getfail(){
    	q.push(0);fail[0]=0;
    	while(!q.empty()){
    		int t=q.front();q.pop();
    		REP(i,0,3) {
    			if(ch[t][i]) q.push(ch[t][i]),fail[ch[t][i]]=t==0?0:ch[fail[t]][i];
    			else ch[t][i]=t==0?0:ch[fail[t]][i];
    		}
    		F[t]|=F[fail[t]];
    	}
    }
    struct node{
    	int a[nmax][nmax];
    	node(){
    		clr(a,0);
    	}
    	node operator*(const node&o)const{
    	  node tmp;
    	  REP(i,0,pt) REP(j,0,pt) REP(k,0,pt) {
    	  	int temp=(ll)a[i][k]*o.a[k][j]%mod;
    	  	tmp.a[i][j]=(tmp.a[i][j]+temp)%mod;
    	  }
    	  return tmp;
    	}
    }a,b;
    void getmatrix(){
    	REP(i,0,pt) a.a[i][i]=1;
    	REP(i,0,pt) REP(j,0,3) if(!F[ch[i][j]]) b.a[i][ch[i][j]]++;
    	while(m){
    		if(m&1) a=a*b;
    		b=b*b;m>>=1;
    	}
    }
    int main(){
    	while(scanf("%d%d",&n,&m)!=EOF){
    	clr(fail,0);clr(ch,0);clr(F,0);pt=0;clr(a.a,0);clr(b.a,0); 
    	REP(i,1,n) scanf("%s",s),insert(s);getfail();
    	getmatrix();
    	int ans=0;
    	REP(i,0,pt) ans=(ans+a.a[0][i])%mod;
    	printf("%d
    ",ans);
        }
    	return 0;
    }
    

      

    DNA Sequence
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 15008   Accepted: 5787

    Description

    It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to analyze a segment of DNA Sequence,For example, if a animal's DNA sequence contains segment ATC then it may mean that the animal may have a genetic disease. Until now scientists have found several those segments, the problem is how many kinds of DNA sequences of a species don't contain those segments. 

    Suppose that DNA sequences of a species is a sequence that consist of A, C, T and G,and the length of sequences is a given integer n. 

    Input

    First line contains two integer m (0 <= m <= 10), n (1 <= n <=2000000000). Here, m is the number of genetic disease segment, and n is the length of sequences. 

    Next m lines each line contain a DNA genetic disease segment, and length of these segments is not larger than 10. 

    Output

    An integer, the number of DNA sequences, mod 100000.

    Sample Input

    4 3
    AT
    AC
    AG
    AA
    

    Sample Output

    36

    Source

    [Submit]   [Go Back]   [Status]   [Discuss]

  • 相关阅读:
    Python实现将IP地址转换为数字
    转 python两个 list 获取交集,并集,差集的方法
    并发编程之协程
    网络编程之协议
    网络编程
    python之路-模块和包
    python IO模型
    python 线程(队列,线程池),协程(理论greenlet,gevent模块,)
    python 线程(部分)Thread的使用,守护线程,互斥锁,递归锁,信号量,事件,条件,定时器
    常见的面试题
  • 原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5712660.html
Copyright © 2011-2022 走看看