一开始打了个n^4的暴力记忆化搜索
然后优化了一下对*的状态转移,因为我们的*可以匹配到当前就不匹配
也可以继续匹配下去,所以并不用枚举到底匹配了多长的串
这样转移就可以把程序优化到n^3
下面是代码
能AC算我输
以及我还没从中午这把狼人杀的阴影里走出来
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
string ss,s;
bool jiyi[503][503],visit[503][503];
int ans,n;
bool dp(int a,int b){
bool& fanhui=jiyi[a][b];
bool& vis=visit[a][b];
if(vis==true){
return fanhui;
}else{
if(a==ss.length()){
if(b==s.length()){
fanhui=true;
}else{
fanhui=false;
}
}else{
if(b==s.length()){
fanhui=false;
vis=true;
return fanhui;
}
if(ss[a]=='?'){
fanhui=dp(a+1,b+1);
}else{
if(ss[a]=='*'){
fanhui=dp(a+1,b)||dp(a,b+1);
}else{
if(ss[a]==s[b]){
fanhui=dp(a+1,b+1);
}else{
fanhui=false;
}
}
}
}
}
vis=true;
return fanhui;
}
int main(){
cin>>ss;
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
memset(visit,false,sizeof(visit));
if(!dp(1,1)){
ans++;
}
}
cout<<ans<<endl;
return 0;
}
/*
in:
A*G?C
3
AGTC
AGTGTC
AGTGC
out:
1
*/