Excuses, Excuses! POJ - 1598(字符串)

题目:

Problem
伊藤法官要求你编写一个程序,该程序将在一堆借口中识别关键字。无论大小写,都可以匹配关键字。
Input
程序的输入将包含多组数据。每组的第1行将恰好包含两个整数。第一个数字(1 <= K <= 20)定义搜索中要使用的关键字数。第二个数字(1 <= E <= 20)定义了要搜索的借口数。第2行到第K + 1行分别只包含一个关键字。K + 2行到K + 1 + E行分别包含一个借口。关键字列表中的所有关键字将仅包含长度为L(1 <= L <= 20)的连续小写字母字符,并且将占据输入行中的第1到L列。所有借口都可以包含任何大写或小写字母数字字符,空格或以下任何标点符号 [".,!?](不包括方括号),并且长度不会超过70个字符。
Output
对于每个输入集,您要从列表中打印最差的借口。最差的借口被定义为包含最多关键词出现次数的借口。如果关键字在借口中多次出现,则每次出现都被视为单独发生。关键字是“以连续形式存在于字符串中并且由行的开头或结尾或任何非字母字符或空格分隔”.
对于每组输入,您都应在字符串“Excuse Set #”之后立即打印一行带有该组编号的行。(请参阅示例输出)。以下几行包含每行最差的借口,与读入的行完全一样。如果存在多于一个的最坏借口,则可以任何顺序打印。在每组输出之后,应打印空白行。
Sample Input
5 3
dog
ate
homework
canary
died
My dog ate my homework.
Can you believe my dog died after eating my canary… AND MY HOMEWORK?
This excuse is so good that it contain 0 keywords.
6 5
superhighway
crazy
thermonuclear
bedroom
war
building
I am having a superhighway built in my bedroom.
I am actually crazy.
1234567890…,0987654321!!!
There was a thermonuclear war!
I ate my dog, my canary, and my homework … note outdated keywords?
Sample Output
Excuse Set #1
Can you believe my dog died after eating my canary… AND MY HOMEWORK?

Excuse Set #2
I am having a superhighway built in my bedroom.
There was a thermonuclear war!

Source
https://vjudge.net/problem/POJ-1598

思路:

大体思路:
  1. 用 set 记录每个关键词
  2. 写个单词转化小写的函数
  3. 存下每个原借口的同时查出其包含的关键词个数并记录(注意转化小写后查找)
  4. 最后一次遍历找出所有最大关键词数的借口输出即可
  5. 注意格式要求 以及 读掉行尾的换行符
几个地方卡了一下:
  1. 忽略了分隔单词的不仅仅是换行和空格,还有某些字符 /(ㄒoㄒ)/~~
  2. t 变量忘了初始化,带着died一块输出了 (;′⌒`) 哎呀呀

具体实现:

int n, m, cp = 0;
string t; //临时变量t
void loww () { //t 转换为全小写的函数
    for(int i = 0 ; i < t.length(); i++)
        if(t[i] <= 'Z') t[i] += 32;
}
int main() { ios::sync_with_stdio(false);
    
    while(cin >> n >> m) {
        cout << "Excuse Set #" << ++cp << endl;
        set<string> ste; //存关键词 提高查找效率

        for(int i = 0; i < n; i++) {
            cin >> t;
            loww(); //别忘了转化
            ste.insert(t);
        } getline(cin, t); //读掉换行符

        int maxx = 0, d[25]={0}; //关键词最大数 每个借口的关键词数
        string s[25]; //原借口
        for(int i = 0; i < m; i++) {
            getline(cin, s[i]); t = "";

            for(int j = 0; j < s[i].length(); j++) {
                if(isalpha(s[i][j])) t += s[i][j];
                else {
                    loww();
                    if(ste.count(t)) d[i]++;
                    t = "";
                }
            }
            maxx = max(maxx, d[i]);
        }

        for(int i = 0; i < m; i++)
            if(d[i] == maxx) //最后一次遍历找到所有符合条件的借口
                cout << s[i] << endl;

        cout << endl;
    }
    return 0;
}
发布了54 篇原创文章 · 获赞 43 · 访问量 1938

猜你喜欢

转载自blog.csdn.net/Jungle_st/article/details/104752588