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]

原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5712660.html