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 |
求助wa,老衲过掉了网上能找到的所有数据,并且和很多人的AC代码对拍掉了很多数据,#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; typedef long long ll; const int maxn=1000,tot=4; const ll bign=100000; struct Node; struct Matrix; typedef Node* pNode; int rank[256],beg; struct Node { int id; int count; pNode son[tot],fail; Node():id(0),fail(0) { memset(son,0,sizeof (son)); } }; pNode root; struct Matrix { int size; ll unit[102][102]; ll*operator [](int i) { return unit[i]; } Matrix():size(0) { memset(unit,0,sizeof (unit)); } Matrix(int s):size(s) { memset(unit,0,sizeof (unit)); } } ans; void Init() { beg=1; root=new Node; root->id=1; } void Insert(char str[]) { pNode u,v; int key; for (u=root;key=rank[*str],*str;u=u->son[key],str++) if (u->son[key]==0)u->son[key]=new Node,u->son[key]->id=++beg; u->count++; } pNode que[400]; bool vis[100]; void Build() { pNode u,v,cur; int key,fi=0,la=-1; root->fail=root; for (key=0;key<tot;key++) if (v=root->son[key])v->fail=root,que[++la]=v; while (fi<=la) { u=que[fi++]; for (key=0;key<tot;key++) { cur=u->fail->son[key]; if (v=u->son[key]) { que[++la]=v; v->fail=(cur)?cur:root; } else u->son[key]=cur; } for (v=u;u->count==0;v=v->fail) { if (v->count) { u->count++; break; } if (v==root)break; } } memset(ans.unit,0,sizeof (ans.unit)); memset(vis,0,sizeof (vis)); ans.size=beg; fi=0,la=-1; que[++la]=root; vis[root->id]=true; while (fi<=la) { u=que[fi++]; if (u->count)continue; for (key=0;key<tot;key++) if (v=u->son[key]) { ans[u->id][v->id]++; if (!vis[v->id])que[++la]=v,vis[v->id]=true; } else ans[u->id][root->id]++; } } char tmp[20]; Matrix operator*(Matrix &a,Matrix&b) { Matrix c(a.size); for (int i=1;i<=a.size;i++) for (int j=1;j<=a.size;j++) for (int k=1;k<=a.size;k++) c[i][j]=(((a[i][k]%bign)*b[k][j])%bign+c[i][j])%bign; return c; } Matrix PowerMod(Matrix &a,int t) { Matrix b(a.size); for (int i=1;i<=a.size;i++)b[i][i]=1; while (t) { if (t&1)b=b*a; a=a*a; t>>=1; } return b; } int main() { int n,m; rank['A']=0; rank['C']=1; rank['T']=2; rank['G']=3; scanf("%d%d",&n,&m); Init(); while (n--)scanf("%s",tmp),Insert(tmp); Build(); ans=PowerMod(ans,m); memset(vis,0,sizeof (vis)); int fi=0,la=-1; ll ret=0; que[++la]=root; vis[root->id]=true; while (fi<=la) { pNode u=que[fi++],v; if (u->count)continue; ret=(ret+ans[root->id][u->id])%bign; for (int key=0;key<tot;key++) if ((v=u->son[key])&&!vis[v->id]) que[++la]=v,vis[v->id]=true; } printf("%I64d\n",ret); return 0; } //1. long long used. //2. The fact that some virus string is the substring of others also be considered. //3. Do you have any other adivice? Thanks for you help.. // ______________________________an ACMer in desperate need of your help Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator