| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
编译不过求解释~~~(poj2778.c)#include<stdio.h>
struct node
{
struct node *next[5];
struct node *fail;
int flag,num;
}*root,*line[3000];
int m,n,i,j,nu,head,tail,key,k;
long long anss;
char str[20];
struct M
{
long long x[300][300];
}*mat,*ans;
int getnum(char c)
{
if (c=='A') return 1;
if (c=='C') return 2;
if (c=='G') return 3;
if (c=='T') return 4;
}
void trie()
{
struct node *p=root;
int i=1; int key;
while (i<=strlen(str))
{
key=getnum(str[i-1]);
if (p->next[key]==NULL)
{
p->next[key]=(struct node *)malloc(sizeof(struct node));
nu++;
p->next[key]->num=nu;
for (j=1;j<=4;j++)
{
p->next[key]->next[j]=NULL;
}
p->next[key]->flag=0;
}
p=p->next[key];
i++;
}
p->flag=1;
}
void buildac()
{
root->fail=NULL;
line[1]=root;
head=0; tail=1;
while (head<tail)
{
head++;
struct node *p=line[head];
for (i=1;i<=4;i++)
{
if (p->next[i]!=NULL)
{
if (p==root) p->next[i]->fail=root;
else
{
struct node *temp=p->fail;
while (temp!=NULL)
{
if (temp->next[i]!=NULL)
{
p->next[i]->fail=temp->next[i];
break;
}
temp=temp->fail;
}
if (temp==NULL) p->next[i]->fail=root;
}
tail++;
line[tail]=p->next[i];
}
}
}
}
void buildmat()
{
struct node *p=root;
line[head]=root;
head=0;tail=1;
int i;
while (head<tail)
{
head++;
p=line[head];
if (p!=NULL && p->flag==0)
{
key=p->num;
for (i=1;i<=4;i++)
{
if (p->next[i]!=NULL && p->next[i]->flag==0)
mat->x[key][p->next[i]->num]++;
if (p->next[i]==NULL) mat->x[key][1]++;
if (p->next[i]!=NULL)
{
tail++;
line[tail]=p->next[i];
}
}
}
}
}
struct M *mul(struct M *a, struct M *b)
{
struct M *c;
c=(struct M *)malloc(sizeof(struct M));
for (i=1;i<=nu;i++)
{
for (j=1;j<=nu;j++)
{
c->x[i][j]=0;
for (k=1;k<=nu;k++)
{
c->x[i][j]+=(a->x[i][k])*(b->x[k][j]);
}
}
}
return c;
}
struct M *mi(struct M *a,int n)
{
struct M *ans;
ans=(struct M *)malloc(sizeof(struct M));
for (i=1;i<=nu;i++)
ans->x[i][i]=1;
while (n)
{
if (n&1) ans=mul(a,ans);
a=mul(a,a);
n=n>>1;
}
return ans;
}
int main()
{
scanf("%d%d",&m,&n);
root=(struct node *)malloc(sizeof(struct node));
for (i=1;i<=4;i++)
{
root->next[i]=NULL;
}
root->flag=0;
root->num=1;
nu=1;
for (i=1;i<=m;i++)
{
scanf("%s",str);
trie();
}
buildac();
mat=(struct M *)malloc(sizeof(struct M));
buildmat();
mat=mi(mat,n);
for (i=1;i<=nu;i++)
{
anss+=mat->x[1][i];
}
printf("%lld\n",(anss%100000));
// system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator