UVA 156:Ananagrams (vector+map+sort)

题意:一大堆单词中间有空格隔开,以‘#’结束输出,问只出现一次的的单词有哪些(如果两个具有相同的长度,相同的字母也算是相同的,不区分大小写,如:noel和lone属于一个单词出现两次)。最后按照字典序输出那些只出现一次的单词

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e6+10;
using namespace std;
vector<string> v;
map<string,int> mmp;
//将字符串转换成小写,并将该字符串中的字符按字典序排序
string change(string a)
{
	for(int i=0;i<a.length();i++)
		a[i]=tolower(a[i]);
	sort(a.begin(),a.end());
	return a;
}
int main(int argc, char const *argv[])
{
	ios::sync_with_stdio(false);
	string ch;
	while(cin>>ch&&ch[0]!='#')
	{
		//单词存入v
		v.push_back(ch);
		//将单词转化一下,用map标记
		string word=change(ch);
		mmp[word]++;
	}
	vector<string>ans;
	for(int i=0;i<v.size();i++)
	{
		//如果单词出现一次,将该单词加入ans中
		if(mmp[change(v[i])]==1)
			ans.push_back(v[i]);
	}
	//字典序排序
	sort(ans.begin(),ans.end());
	for(int i=0;i<ans.size();i++)
		cout<<ans[i]<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wang_123_zy/article/details/81151906