P1003
Description
作为一名网络警察,你的任务是监视电子邮件,看其中是否有一些敏感的关键词。不过,有些狡猾的犯罪嫌疑人会改变某些单词的字母顺序,以逃避检查。请编写一个程序,发现这种调整过顺序的关键词。程序的输入有两行,第一行是关键词列表,第二行是待检查的句子。程序的输出为在该句子中所找到的经过顺序调整的关键词。(单词全部为小写,单词之间以一个空格分隔,每一行的单词个数不限)
Input
第一行是关键词列表,第二行是待检查的句子。
Output
经过顺序调整的关键词。(单词全部为小写,单词之间以一个空格分隔,每一行的单词个数不限)
Sample Input 1
guns mines missiles
aameric ssell snug dan iimsssle ot sit neeemis
Sample Output 1
guns missiles
Hint
HINT:时间限制:1.0s 内存限制:256.0MB
AC代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#define maxn 10000
using namespace std;
vector<string> a;
vector<string> b;
vector<string> m;
bool vis[maxn];
bool cmp(string x, string y)
{
int count = 0;
memset(vis, 0, sizeof(vis));
for (int i = 0; i < x.size(); i++)
{
for (int j = 0; j < y.size(); j++)
{
if (x[i] == y[j] && !vis[j])
{
vis[j] = 1;
count++;
break;
}
}
}
if (count == x.size() && count == y.size())
return true;
else
return false;
}
int main()
{
string tmp;
getline(cin, tmp);
string c = "";
for (int i = 0; i < tmp.size(); i++)
{
if (tmp[i] != ' ')
{
c += tmp[i];
}
else
{
a.push_back(c);
// cout << c << endl;
c = "";
}
}
a.push_back(c);
getline(cin, tmp);
c = "";
for (int i = 0; i < tmp.size(); i++)
{
if (tmp[i] != ' ')
{
c += tmp[i];
}
else
{
b.push_back(c);
c = "";
}
}
b.push_back(c);
int d[a.size()] = {0};
for (int i = 0; i < b.size(); i++)
{
for (int j = 0; j < a.size(); j++)
{
if (cmp(a[j], b[i]) && !d[j])
{
d[j] = 1;
m.push_back(a[j]);
}
}
}
for (int i = 0; i < a.size(); i++)
{
for (int j = 0; j < m.size(); j++)
{
if (a[i] == m[j])
{
cout << a[i] << " ";
break;
}
}
}
return 0;
}
解题思路:
运用getline输入整行数据,根据stl中的stringstream的用法可以取每一个字符串,首先保存每一个字符串的原始数据,然后对字符串进行排序,保存排序后的字符串,对排序后的字符串进行比较是否相同,相同则保存原来数据于新的数组