我心好痛啊…f**k
-1改成0x3f3f3f3f就过了…这么玄妙的东西我卡了半个月我服
等老师再研究一下吧,我现在不想看到这道题
//一道题的代码几乎能背过是什么体验
注释不删,等待第二版更新
#include <cmath>
#include <climits>
#include <cstdlib>
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1005;
int T,n,len,tot,ans,temp,ch[maxn][4],fail[maxn],flag[maxn],dp[maxn][maxn],q[maxn];
char str[maxn];
int value(char c)
{
if(c=='A')return 0;
if(c=='C')return 1;
if(c=='T')return 2;
if(c=='G')return 3;
return -1;
}
void newnode(int x,int s)
{
ch[x][s]=++tot;
for(int i=0;i<4;i++)
ch[tot][i]=0;
flag[tot]=0;
//cout<<x<<' '<<s<<' '<<tot<<endl;
}
void Insert(char s[])
{
int x=0,p=0,len=strlen(s);
while(p!=len)
{
if(!ch[x][value(s[p])])ch[x][value(s[p])]=++tot;//newnode(x,value(s[p]));
//cout<<value(s[p])<<' '<<ch[x][value(s[p])]<<endl;
x=ch[x][value(s[p])];
p++;
}
flag[x]=1;
}
void getfail(void)
{
int h=0,t=0;
for(int i=0;i<4;i++)
if(ch[0][i])
q[t++]=ch[0][i];
while(h!=t)
{
int now=q[h++];
for(int i=0;i<4;i++)
{
if(!ch[now][i])
ch[now][i]=ch[fail[now]][i];
else
{
q[t++]=ch[now][i];
fail[ch[now][i]]=ch[fail[now]][i];
flag[ch[now][i]]|=flag[fail[ch[now][i]]];
}
}
}
}
int main(void)
{
//freopen("test2.txt","w",stdout);
while(scanf("%d",&n) && n)
{
tot=0;
//for(int i=0;i<4;i++)
// ch[tot][i]=0;
//flag[tot]=0;
memset(ch,0,sizeof(ch));
memset(fail,0,sizeof(fail));
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++)
{
scanf("%s",str);
Insert(str);
}
getfail();
scanf("%s",str);
len=strlen(str);
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
//cout<<tot<<endl;
for(int i=1;i<=len;i++)
for(int j=0;j<=tot;j++)
if(dp[i-1][j]!=0x3f3f3f3f)
for(int k=0;k<4;k++)
{
temp=ch[j][k];
if(!flag[temp])
{
dp[i][temp]=min(dp[i][temp],dp[i-1][j]+(k!=value(str[i-1])));
//cout<<i<<' '<<j<<endl;
//printf("%d %d %d %d %d\n",i,j,k,temp,dp[i][temp]);
}
}
ans=0x3f3f3f3f;
for(int i=0;i<=tot;i++)
//if(dp[len][i]!=-1)
if(!flag[i])
ans=min(ans,dp[len][i]);
if(ans == 0x3f3f3f3f) ans = -1;
printf("Case %d: %d\n",++T,ans);
}
return 0;
}