uva 156 5-4

本题主要学习的就是map的用法。。map就是一个映射。。可以从string对应到int 或者之类的都可以。。

因为题目中说输出不能通过字母重排而在文本中找到另一个单词的单词。。那么就意味着这样的单词(字母组合)只能在文本中出现一次,,那么我们将每个单词的所有字母进行标准化也就是一个排序,如果有个单词排序后与另一个单词排序后的字符串一样,那么这两个就是重复的。。于是乎我们可以建立单词(字母组合)与出现次数的映射,,然后事先将所输入的单词存储到vector中(其实感觉用数组还是vector没有太多的差别)。。。最后输入结束后遍历之前的那个vector,将vector中的每个string再进行标准化,如果所对应标准化后的string总共出现了一次那么久将原来的单词压入一个新的vector(将来用于输入符合要求的string)。。将新的vector进行排序。。最后遍历新的vector输出单词。

附上代码

#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
using namespace std;
map<string,int> mapword;
vector<string> word;
string rer(string& s)
{
	string ans=s;
	for(int i=0;i<ans.size();i++)
		ans[i]=tolower(ans[i]);
	sort(ans.begin(),ans.end());
	return ans;
}
int main ()
{
	string s;
	while (cin >> s)
	{
		if(s == "#") break;
		word.push_back(s); 
		string r = rer(s);
		if(!mapword.count(r)) mapword[r]=0;
		mapword[r]++;
	}
	vector<string> dict;
	for(int i=0;i<word.size();i++)
	{
		if(mapword[(rer(word[i]))]==1)
		dict.push_back(word[i]);
	}
	sort(dict.begin(),dict.end());
	for(int i=0;i < dict.size();i++)
	cout << dict[i] << endl;
	return 0;
}


之后我脑洞大开。。。orz 觉得既然最后输出的单词肯定是没有重复的那么我们岂不是可以用set集合来存储符合条件的单词吗。。这样还不用排序了呢orzorz

然后又一点要注意的就是set和map是没有像vector中的push_back 和pop_back的,我们需要用insert 和erase来进行插入和删除的操作~

附上set的代码:

#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
using namespace std;
map<string,int> mapword;
vector<string> word;
string rer(string& s)
{
	string ans=s;
	for(int i=0;i<ans.size();i++)
		ans[i]=tolower(ans[i]);
	sort(ans.begin(),ans.end());
	return ans;
}
int main ()
{
	string s;
	while (cin >> s)
	{
		if(s == "#") break;
		word.push_back(s); 
		string r = rer(s);
		if(!mapword.count(r)) mapword[r]=0;
		mapword[r]++;
	}
	set<string> dict;
	for(int i=0;i<word.size();i++)
	{
		if(mapword[(rer(word[i]))]==1)
		dict.insert(word[i]);
	}
	set<string>::iterator it;
	for(it=dict.begin();it!=dict.end();it++)
	cout << *it << endl;
	return 0;
}


你可能感兴趣的:(uva 156 5-4)