1966: [Ahoi2005]VIRUS 病毒检测

来源:互联网 发布:nodejs cms系统 编辑:程序博客网 时间:2024/04/30 18:06

题目链接

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

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

我的收获:大力暴力

暴力1

#include <iostream>#include <cstring>#include <cstdio>using namespace stdint 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;}
原创粉丝点击