POJ 2778 ac自动机+矩阵快速幂

DNA Sequence
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 10757   Accepted: 4104

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


ac自动机+矩阵快速幂。

sb错误纠结一晚上,吐槽一下。

/* ***********************************************
Author :xianxingwuguan
Created Time :2014-2-2 22:56:06
File Name :1.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
const ll mod=100000;
struct Matrix{
	ll n,mat[200][200];
	Matrix(){}
	Matrix(ll _n){
		n=_n;
		for(ll i=0;i>=1;
	}
	return ans;
}
struct Trie{
	ll next[300][4],fail[300],end[300];
	ll L,root;
	ll newnode(){
		for(ll i=0;i<4;i++)
			next[L][i]=-1;
		end[L++]=0;
		return L-1;
	}
	void init(){
		L=0;
		root=newnode();
	}
	ll id(char ch){
		if(ch=='A')return 0;
		if(ch=='T')return 1;
		if(ch=='C')return 2;
		return 3;
	}
	void insert(char *str){
		ll len=strlen(str);
		ll now=root;
		for(ll i=0;i q;
		fail[root]=root;
		for(ll 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()){
			ll now=q.front();
			q.pop();
			if(end[fail[now]])end[now]=1;
			for(ll 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]);
				}
		}
	}
		Matrix solve(){
			Matrix ans=Matrix(L);
			for(ll i=0;i>n>>m){
		 ac.init();
		 while(n--){
			scanf("%s",str);
			ac.insert(str);
		 }
		// cout<<"hahha:"<


你可能感兴趣的:(字符串杂题)