1966: [Ahoi2005]VIRUS 病毒检测

题目链接

题目大意:判断模板串和给出的其他串中不能匹配的数目,模板串中可能出现’?’可以匹配1个任意字符,’*’可以匹配0–INF个任意字符

题解:AC自动机?正则表达式?
暴力,暴力!用时在bzoj上排倒数……
去题解膜了一发暴力2,跑的飞快……

我的收获:大力暴力

暴力1

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
 
int n,ans,len1,len2;
int vis[1005][505];
bool f[1005][505];
char T[1005],s[505];
 
bool dfs(int la,int lb)
{
    if(la==len1&&lb==len2) return true;
    if(la>len1||lb>len2) return false;
    if(vis[la][lb]!=-1) return f[la][lb];
    if(T[la]==s[lb]) f[la][lb]=dfs(la+1,lb+1);
    else if(T[la]=='?') f[la][lb]=dfs(la+1,lb+1);
    else if(T[la]=='*') f[la][lb]=dfs(la,lb+1)||dfs(la+1,lb);
    else f[la][lb]=0;
    vis[la][lb]=1;
    return f[la][lb];
}
 
void init()
{
    scanf("%s",T);len1=strlen(T);
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%s",s);len2=strlen(s);
        memset(vis,-1,sizeof(vis));
        memset(f,0,sizeof(f));
        ans+=!dfs(0,0);
    }
    cout<<ans<<endl;
}
 
int main()
{
    init();
    return 0;
}

跑的飞快的暴力2

#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<iomanip>
using namespace std;
string bingdu;
string rna;
int ilen,jlen,ans=0;
int spare[1002];
bool judge(int i,int j)
{
    if(i==ilen&&j==jlen) return true;
    if(i==ilen&&j<jlen) return false;
    if(bingdu[i]=='?') return judge(i+1,j+1);
    if(bingdu[i]!='*')
   {
       if(bingdu[i]==rna[j]) return judge(i+1,j+1);
       return false;
   }
 
    for(int k=0;j+spare[i]+k<=jlen;k++)
    {
        if(judge(i+1,j+k)==true) return true;
    }
    return false;
}
int main()
{
    cin>>bingdu;
    int n;
    cin>>n;
    ilen=bingdu.length();
    spare[ilen]=0;
    for(int i=ilen-1;i>=0;i--)
    {
        spare[i]=spare[i+1];
        if(bingdu[i]!='*') spare[i]=spare[i]+1;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>rna;
        jlen=rna.length();
        if(judge(0,0)==false) ans++;
    }
    cout<<ans;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值