这题WA了.. 实在找不出错,CP了很多AC代码,大数据都是一样的。
哪位大神行行好帮我看看哪错了吧.....
#include<iostream>
#include<cstdio>
#include<string.h>
#define kind 26
#define MAX 100
using namespace std;
struct node{
int fail,flag;
int next[kind];
void init(){
memset(next,0,sizeof(next));
fail=flag=0;
}
}Tire[MAX];
typedef unsigned __int64 ull;
int root,allocp;
int N,L;
ull matrix[MAX][MAX];
void init(){
root=allocp=0;
Tire[root].init();
memset( matrix,0,sizeof(matrix) );
}
void Insert( char *s )
{
int i=0,k;
int p=root;
while( s[i] ){
k=s[i++]-'a';
if( !Tire[p].next[k] ){
Tire[++allocp].init();
Tire[p].next[k]=allocp;
}else if( Tire[Tire[p].next[k]].flag )
break;
p=Tire[p].next[k];
}
Tire[p].flag++;
}
void build_ac_automation()
{
int queue[MAX],head,tail;
head=tail=0;
queue[tail++]=root;
while( head!=tail ){
int cur=queue[head++];
for( int i=0;i<kind;i++ ){
if( Tire[cur].next[i] ){
int son=Tire[cur].next[i];
int p=Tire[cur].fail;
if( cur==root ) Tire[son].fail=root;
else Tire[son].fail=Tire[p].next[i];
if( Tire[Tire[son].fail].flag )
Tire[son].flag++;
queue[tail++]=son;
}
else{
int p=Tire[cur].fail;
if( cur==root ) Tire[cur].next[i]=root;
else Tire[cur].next[i]=Tire[p].next[i];
}
}
}
}
void set_matrix()
{
allocp++;
for( int i=0;i<allocp;i++ ){
if( Tire[i].flag )
continue;
for( int j=0;j<kind;j++ ){
int son=Tire[i].next[j];
if( Tire[son].flag==0 )
matrix[i][son]++;
}
}
for( int i=0;i<allocp;i++ )
matrix[i][allocp+i]=matrix[allocp+i][allocp+i]=1;
}
void matriXmult( ull b[][MAX],ull c[][MAX],int r )
{
ull a[MAX][MAX];
memset( a,0,sizeof(a) );
for( int i=0;i<r;i++ )
for( int j=0;j<r;j++ )
for( int k=0;k<r;k++ )
a[i][j]+=b[i][k]*c[k][j];
for( int i=0;i<r;i++ )
for( int j=0;j<r;j++ )
b[i][j]=a[i][j];
}
ull getPower(){
ull res[MAX][MAX],temp[MAX][MAX];
memset( res,0,sizeof(res) );
memset( temp,0,sizeof(temp) );
res[0][0]=res[1][1]=1;
temp[0][0]=kind;
temp[0][1]=temp[1][1]=1;
temp[1][0]=0;
for( int i=0;i<31;i++ ){
if( L&(1<<i) )
matriXmult(res,temp,2);
matriXmult(temp,temp,2);
}
return res[0][0]+res[0][1]-1;
}
ull matrix_Power( ull matrix[][MAX] )
{
ull res[MAX][MAX],temp[MAX][MAX];
memset( res,0,sizeof(res) );
memset( temp,0,sizeof(temp) );
for( int i=0;i<2*allocp;i++ )
{
res[i][i]=1;
for( int j=0;j<2*allocp;j++ )
temp[i][j]=matrix[i][j];
}
for( int i=0;i<31;i++ ){
if( L&(1<<i) )
matriXmult( res,temp,2*allocp );
matriXmult( temp,temp,2*allocp );
}
ull ret=0;
for( int i=0;i<2*allocp;i++ )
ret+=res[0][i];
return ret-1;
}
int main()
{
//freopen( "my.out","w",stdout );
//freopen( "test.in","r",stdin );
char str[11];
while( scanf("%d%d",&N,&L)!=EOF )
{
init();
while( N-- ){
scanf( "%s",&str );
Insert(str);
}
build_ac_automation();
set_matrix();
ull total=getPower();
ull sum=matrix_Power(matrix);
printf( "%I64u\n",total-sum );
}
return 0;
}