| ||||||||||
| 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 | |||||||||
用C++交交看In Reply To:编译不过求解释~~~(poj2778.c) Posted by:sssxxxfff at 2014-06-28 21:53:53 > #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