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();
    }
}
View Code

相关文章:

  • 2021-08-13
  • 2021-10-03
  • 2021-06-26
  • 2022-02-24
  • 2021-10-27
  • 2022-01-24
  • 2021-07-13
  • 2021-11-09
猜你喜欢
  • 2021-08-01
  • 2021-06-14
  • 2021-07-23
  • 2021-08-07
  • 2021-10-07
  • 2021-09-24
  • 2021-11-02
相关资源
相似解决方案