您的位置:首页 > 其它

bzoj千题计划205:bzoj1966: [Ahoi2005]VIRUS 病毒检测

2018-01-08 09:32 330 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=1966

f[i][j] 表示s的前i个和t的前j个是否匹配

转移看代码

注意初始化:

f[0][0]=true

f[i][0]=true s[1,i]='*'

如果没有第二个,反例:

***A

A

f[4][1]=f[3][0]

#include<cstdio>
#include<cstring>

using namespace std;

#define N 1001
#define M 501

char s
,t[M];
int ls,lt;

int ans;

bool f
[M];

void solve()
{
memset(f,false,sizeof(f));
f[0][0]=true;
for(int i=1;i<=ls;++i)
if(s[i]=='*') f[i][0]=true;
else break;
for(int i=1;i<=ls;++i)
for(int j=1;j<=lt;++j)
if(s[i]==t[j]) f[i][j]=f[i-1][j-1];
else
{
if(s[i]=='?') f[i][j]=f[i-1][j-1];
else if(s[i]=='*') f[i][j]=f[i][j-1]|f[i-1][j-1]|f[i-1][j];
}
if(f[ls][lt]) ans++;
}

int main()
{
scanf("%s",s+1);
ls=strlen(s+1);
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%s",t+1);
lt=strlen(t+1);
solve();
printf("%d",f[ls][lt] ? 1 : 0);
}
printf("%d",n-ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: