uva 409 Excuses, Excuses!

就是问每一行有多少keywords,重复的keywords可以累加。但如果keywords是某个单词的子串就不行,如keyword "abc" 在句子 " yj aabcc"中是没有的。换句话说,就是要完全匹配。

数据很小,暴力就能过。

#include <iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
char key[30][30];
char str[25][100];
int re[25];

bool excuse(int c,int a,int b)  //判断是否完全匹配
{                               //c:第几个句子 a:当前句子中的位置 b:第几个keyword
    int i = 1;
    for(i = 1;i < strlen(key[b]);i++)
    {
        if(str[c][a+i] == key[b][i] || str[c][a+i] +32 == key[b][i]) continue;
        else return false;
    }
    if(str[c][a+i] >= 65 && str[c][i] <= 122)  //在‘A'到’z'之间
    {
        return false;
    }
    else return true;
}

int main()
{
   int k,e;
   int cnt = 1;

   while(scanf("%d %d",&k,&e)!=EOF)
   {
   int max = 0;
   memset(re,0,sizeof(re));
   for(int i = 0 ;i < k;i++)
   {
       scanf("%s",key[i]);
   }
   getchar();
   for(int i = 0;i < e;i++)
    str[i][0] = ' ';  //把每个句子第0位置为空
   for(int i = 0; i < e;i++)
       cin.getline(str[i]+1,100);  //读取完整一行
   for(int i =0 ;i < e;i++)
    {
        int j = 0;
       while(j < strlen(str[i]))
       {
           while(str[i][j] >= 65 && str[i][j] <= 122) //当没有读到下一个单词时
               j++;
           j++;
           for(int m = 0; m < k;m++)
           {
               if(str[i][j] == key[m][0] || str[i][j] + 32 == key[m][0])
               {
                   if(excuse(i,j,m)) 
                   {
                       re[i]++; 
                       j+=(strlen(key[m])-1);
                       continue;
                   }
               }
           }
       }
        if(re[i] >= max) max = re[i];
    }
    printf("Excuse Set #%d\n",cnt++);
    for(int i = 0; i < e;i++)
    {
        if(re[i] == max) printf("%s\n",str[i]+1);
    }
    printf("\n");
   }
    return 0;
}



你可能感兴趣的:(uva 409 Excuses, Excuses!)