HDU2457 DNA repair AC自动机

来源:互联网 发布:淘宝虚拟物品发货 编辑:程序博客网 时间:2024/06/05 09:03

这题真的是我的痛!一晚上调了3小时,全都WA了。。。在网上还找了一大堆数据,算的都一样抓狂抓狂原来,格式错了。。。

#include<stdio.h>#include<string.h>#include<queue>using namespace std;#define maxn 1010int n,ch[maxn][4],val[maxn],fail[maxn],d[maxn][maxn],tot,root;char a[maxn];int newnode(){memset(ch[tot],0,sizeof(ch[tot]));val[tot]=0;return tot++;}int id(char t){if(t=='A')return 0;else if(t=='C')return 1;else  if(t=='G')return 2;else return 3;}void insert(){int len=strlen(a),cur=root,i;for(i=0;i<len;i++){if(!ch[cur][id(a[i])])ch[cur][id(a[i])]=newnode();cur=ch[cur][id(a[i])];}val[cur]=1;}queue<int>q;void getfail(){fail[root]=root;for(int i=0;i<4;i++)if(ch[root][i]){fail[ch[root][i]]=root;q.push(ch[root][i]);}while(!q.empty()){int cur=q.front();q.pop();for(int i=0;i<4;i++)if(!ch[cur][i])ch[cur][i]=ch[fail[cur]][i];else{fail[ch[cur][i]]=ch[fail[cur]][i];val[ch[cur][i]]|=val[ch[fail[cur]][i]];q.push(ch[cur][i]);}}}int min(int a,int b){return a<b?a:b;}int main(){int ex=1;while(~scanf("%d",&n)&&n){int i,k,j;tot=0;root=newnode();for(i=0;i<n;i++){scanf("%s",a);insert();}getfail();scanf("%s",a);memset(d,0x3f,sizeof(d));d[0][0]=0;int len=strlen(a);for(i=0;i<len;i++)for(j=0;j<tot;j++)if(d[i][j]!=0x3f3f3f3f)for(k=0;k<4;k++){if(val[ch[j][k]])continue;d[i+1][ch[j][k]]=min(d[i+1][ch[j][k]],d[i][j]+(k==id(a[i])?0:1));}int ans=0x3f3f3f3f;for(j=0;j<tot;j++)if(ans>d[len][j])ans=d[len][j];printf("Case %d: ",ex++);if(ans==0x3f3f3f3f)printf("-1\n");elseprintf("%d\n",ans);}return 0;}


0 0