• DNA Sequence POJ


    定义重载运算的时候一定要将矩阵初始化,因为这个调了一上午......

    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("
    ");
    	}
    }
    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;
    }
    

      

  • 相关阅读:
    【JZOJ6409】困难的图论
    学习LCT小结
    jzoj5432. 【NOIP2017提高A组集训10.28】三元组
    jzoj6367. 【NOIP2019模拟2019.9.25】工厂(factory)
    jzoj6366. 【NOIP2019模拟2019.9.25】化学(chem)
    jzoj5433. 【NOIP2017提高A组集训10.28】图
    学习拓展中国剩余定理小结
    jzoj6300. Count
    jzoj3736. 【NOI2014模拟7.11】数学题
    jzoj6276. 【noip提高组模拟1】树
  • 原文地址:https://www.cnblogs.com/guangheli/p/9903163.html
Copyright © 2020-2023  润新知