kmp 填空

http://acm.fzu.edu.cn/problem.php?pid=1926


input

1

much of the language used to describe monetary policy such as steering the economy to a soft landing or a touch on the brakes makes it sound like a precise science nothing could be further from the truth @

3

much of the language _ _ describe monetary policy @

steering the economy to a _ landing @

much of the _ describe monetary @


一串字符,以@结尾,作为母串.

接下来n各子串,也已@作为结尾,子串中包含 _ 代表需要填写的单词,问,能不能匹配.


#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
int T,n,len_s,len_ss,pos,next[1111];
char str[1111];
string s[1111],ss[1111];
void getnext(){
    memset(next,0,sizeof(next));
    int i=0,j=-1;
    next[i]=j;
    while(i!=len_ss){
        if(j==-1||ss[i]==ss[j]||ss[i]=="_"||ss[j]=="_"){ //在这里加入判断就好了
            next[++i]=++j;
        }
        else{
            j=next[j];
        }
    }
}
bool kmp(){
    int i=0,j=0;
    while(i!=len_s&&j!=len_ss){
        if(j==-1||s[i]==ss[j]||ss[j]=="_"){  //在这里加入判断
            ++i;j++;
            if(j==len_ss){
                return true;
            }
        }
        else{
            j=next[j];
        }
    }
    return false;
}
int main(){
    scanf("%d",&T);
    int cas=1;
    while(T--){
        pos=0;
        printf("Case %d:\n",cas++);
        while(1){
            scanf("%s",str);
            if(strcmp(str,"@")==0){
                break;
            }
            s[pos++]=string(str);
        }
        len_s=pos;
        scanf("%d",&n);
        while(n--){
            pos=0;
            while(1){
                scanf("%s",str);
                if(strcmp(str,"@")==0){
                    break;
                }
                ss[pos++]=string(str);
            }
            len_ss=pos;
            getnext();
            if(kmp()){
                printf("YES\n");
            }
            else{
                printf("NO\n");
            }
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值