bzoj1966: [Ahoi2005]VIRUS 病毒检测

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[N],t[M];
int ls,lt;

int ans;

bool f[N][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);
}

 

posted @ 2018-01-08 09:32  TRTTG  阅读(264)  评论(0编辑  收藏  举报