记录编号 367774 评测结果 AAAAAAAAAA
题目名称 [SPOJ 1676]文本生成器 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.613 s
提交时间 2017-02-01 21:50:10 内存使用 0.88 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=210,mod=10007;
int n,l,top,go[N][26],fail[N];
char s[N];bool end[N];
struct matrix{
	int a[N][N];
	matrix(){memset(a,0,sizeof a);}
	void operator *= (const matrix x){
		matrix ans;
		for (int i=1;i<=top*2;i++)
		for (int j=1;j<=top*2;j++)
		for (int k=1;k<=top*2;k++)
			(ans.a[i][j]+=a[i][k]*x.a[k][j])%=mod;
		memcpy(a,ans.a,sizeof a);
	}
}x,ans;
matrix mi(matrix x,int y){
	matrix ans=x;y--;
	for (;y;y>>=1,x*=x)
		if (y&1) ans*=x;
	return ans;
}
void trie(){
	int len=strlen(s+1),p=1;
	for (int i=1;i<=len;i++){
		s[i]-='A';
		p=!go[p][s[i]]?go[p][s[i]]=++top:go[p][s[i]];
	}
	end[p]=1;
}
void getfail(){
	queue<int> Q;
	for (int i=0;i<26;i++)
		if (go[1][i]) Q.push(go[1][i]),fail[go[1][i]]=1;
	while (!Q.empty()){
		int v=Q.front();Q.pop();
		for (int i=0;i<26;i++)
		if (go[v][i]){
			int u=go[v][i],now=fail[v];
			while (now&&!go[now][i]) now=fail[now];
			fail[u]=now?go[now][i]:1;
			end[u]|=end[fail[u]];
			Q.push(u);
		}
	}
	for (int v=1;v<=top;v++)
	for (int i=0;i<26;i++){
		if (!go[v][i]){
			int now=fail[v];
			while (now&&!go[now][i]) now=fail[now];
			go[v][i]=now?go[now][i]:1;
		}
		int u=go[v][i];
		x.a[v+top][u+top]++;
		x.a[v][end[u]?u+top:u]++;
	}
}
int main()
{
	freopen("textgen.in","r",stdin);
	freopen("textgen.out","w",stdout);
	top=1;
	scanf("%d%d",&n,&l);
	for (int i=1;i<=n;i++)
		scanf("%s",s+1),trie();
	getfail();
	ans.a[1][1]=1;
	ans*=mi(x,l);
	int Ans=0;
	for (int i=1;i<=top;i++)
		Ans=(Ans+ans.a[1][i+top])%mod;
	printf("%d\n",Ans);
	return 0;
}