借口!借口!

题意描述

法官伊藤正在遇到一个问题,因为陪审人员被传唤,给予相当跛脚的借口,以避免服刑。为了减少愚蠢的借口所需的时间,伊藤法官已经要求你编写一个程序,将在一个找到跛脚借口的借口列表中搜索一个关键字列表。关键字可以在一个借口中匹配,无论情况如何。

输入

您的程序的输入将由多组数据组成。每组的第1行将仅包含两个整数。第一个数字(1 <= K <= 20)定义搜索中要使用的关键字数量。第二个数字(1 <= E <= 20)定义要搜索的集合中的借口数量。第2到第K行1每个都包含一个关键字。线K + 2至K + 1 + E每个都包含一个借口。关键字列表中的所有关键字将仅包含长度为L(1 <= L <= 20)的连续小写字母字符,并将在输入行中占据列1到L。所有的借口都可以包含任何大写或小写字母数字字符,空格或任何以下标点符号[“!,!?]不包括方括号,长度不得超过70个字符,排除次数将至少包含1个非空格字符

产量

对于每个输入集,您将从列表中打印最差的借口。最坏的借口被定义为包含关键字发生率最多的借口。如果一个关键字出现不止一次的借口,每个发生被认为是一个单独的发生。当且仅当连续形式存在于字符串中并且由该行的开始或结尾或任何非字母字符或空格分隔时,关键字“发生”在一个借口中。

对于每一组输入,您将打印一行,紧跟在字符串“Excuse Set#”之后的集合中。(见样品输出)。以下行是/包含每行正确读取的最坏的借口。如果有多个最坏的借口,您可以按任何顺序打印。在每组输出后,您应该打印一个空行。

样品输入

5 3


家庭作业
金丝雀
死亡
我的狗吃了我的功课
你可以相信我的狗在吃我的金丝雀后死了…和我的主页?
这个借口是非常好的,它包含0个关键字。
6 5
超级公路

热核
卧室
战争
建造
我在卧室里建了一个高速公路。
我其实很疯狂
1234567890 ,,,,, ….. ????? 0987654321 !!!!!!
有一场热核战争!
我吃了我的狗,我的金丝雀和我的家庭作业…注意到过时的关键字?

样品输出

排除套装#1
你可以相信我的狗在吃我的金丝雀后死了…和我的主页?

Excuse Set#2
我在卧室里建了一个高速公路。
有一场热核战争!

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<cctype>
#include<string>
using namespace std;
void tolow(char s[])
{
    int tt=strlen(s);
    for(int i=0;i!=tt;i++){
        if(s[i]>='A'&&s[i]<='Z')
            s[i]+=32;
    }
}
int id(char a[],char b[])//注意调用函数中a为长串,b为短串;
{
    tolow(a);
    tolow(b);
    int str1=strlen(a);
    int str2=strlen(b);
    int k,count =0;
    for(int i=0;i!=str1;i++){
        k=0;
        for(int j=i;k!=str2;k++,j++)
        {
            if(a[j]!=b[k])
                break;
        }
        if(k>=str2){
            count++;
            break;
        }
    }
    if(count)
        return 1;
    else
        return 0;
}
int main()
{
    int n,m;
    int q=0;
    while(cin>>n>>m)
    {
        q++;
        char b[100][30];
        for(int i=0;i!=n;i++)
            cin>>b[i];
            getchar();
        char a[100][200];
        char aa[100][200];
        for(int j=0;j!=m;j++){
            gets(a[j]);
            strcpy(aa[j],a[j]);
        }
        int f=0,h=0;
        int sum[100]={0};
        for(f=0;f!=m;f++){
            for(h=0;h!=n;h++){
                sum[f]+=id(a[f],b[h]);
            }
        }
        int MAX=0;
        for (int i=0;i!=m;i++)
            if(MAX <sum[i])MAX=sum[i];
        printf("Excuse Set #%d\n",q);
        for(int j=0;j!=m;j++)
            if(MAX==sum[j])
               puts(aa[j]);
        cout<<endl;



    }
    return 0;
}

测试截图

这里写图片描述
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值