传送门UVa 123 - Searching Quickly
这题的算法不难, 先存入关键词, 然后让每句的每个单词和关键词对比, 如果相同就变为大写, 句子的其余部分变为小写. 最后按关键词的字典序输出句子. 但是做得我蛋疼啊..(╯‵□′)╯ ┴─┴ 然后我就去看解题报告了...
发现了一种用STL做的方法. 正好借个这机会边看代码边研究STL.
看了一晚上, 有点小收获. 等下总结一下.
不过写完这个程序觉得C++的string类有时候也挺方便的.
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
#include <iostream>
#include <cctype>
using namespace std;
int main()
{
//freopen("input.txt", "r", stdin);
set<string> ignores; //创建一个储存string类型的set类容器
multimap<string, string> r; //创建一个储存string, string类型的multimap类容器
string t;
int i;
while (getline(cin, t) && t != "::") //把关键词存入ignores
ignores.insert(t);
while (getline(cin, t))
{
for (i = 0; i < t.size(); i++)
t[i] = tolower(t[i]); //把读取的句子全部变为小写
for (i = 0; i < t.length(); i++) //开始每个单词地比较.
{
if (!isalpha(t[i]))
continue;
string t2;
int j = i;
while (isalpha(t[j]))
{
t2 += t[j];
j++;
}
if (!ignores.count(t2)) //如果在ignores中找不到单词
{
for (int k = 0; k < t2.length(); k++)
{
t2[k] = toupper(t2[k]); //把这个单词变为大写
}
string t3 = t;
t3.replace(i, t2.length(), t2); //替换掉原来的单词, 其他部分不变
r.insert(make_pair(t2, t3)); //把关键词和句子关联起来
}
i = j;
}
}
for (map<string, string> :: iterator i = r.begin(); i != r.end(); i++)
{
cout << i->second << endl;
}
return 0;
}