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); }