T1 黑化
题意:
求一个字符串是否可能包含另一个字符串
字符串中的?可以匹配任意字母
可能输出 God bless You!
一定不可能 输出 Game Over!
计算fail数组时,fail数组不具有传递性
例:
pqkbpqsbqszz
pqkbpq?z
在z处失配后:
pqkbpqsbqszz
pqkbpq?z
z匹配成功,误认为包含
因为计算fail时,?匹配了 k,而匹配时 ?匹配了s
s不和k匹配
即?不具有传递性
#include<cstdio> #include<cstring> #define N 100001 using namespace std; int lens,lent,f[N]; char s[N],t[N];; void getfail() { int j; for(int i=1;i<lent;i++) { j=f[i]; while(j && t[i]!=t[j]) j=f[j]; f[i+1]= t[i]==t[j] ? j+1 : 0; } } void work() { int j=0; for(int i=0;i<lens;i++) { while(j && s[i]!=t[j] && s[i]!='?' && t[j]!='?') j=f[j]; if(s[i]==t[j] || s[i]=='?' || t[j]=='?') j++; if(j==lent) { printf("God bless You!\n"); return; } } printf("Game Over!\n"); } int main() { freopen("trigger.in","r",stdin); freopen("trigger.out","w",stdout); int T; scanf("%d",&T); while(T--) { scanf("%s%s",t,s); lent=strlen(t); lens=strlen(s); getfail(); work(); } }