题目大意:判断模板串和给出的其他串中不能匹配的数目,模板串中可能出现’?’可以匹配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;
}