您的位置:首页 > 其它

FZU 1410 变位词

2009-07-20 19:38 387 查看
变位词

Time Limit:1sMemory limit:32M
Accepted Submit:310Total Submit:1085
Mr. Right有一个奇怪的嗜好,就是看见一个单词就有找它所有的变位词的冲动。一个单词的变位词就是该单词所有字母的一个排列。
输入输出格式

输入数据第一行为一个整数n,1<=n<=10^5,之后n行每行只包含一个单词,不含词组。这些单词构成了Mr. Right的字典。每个单词长度不大于9个字母。接着一行为一个整数m,1<=m<=100,表示Mr. Right将看见的单词数。之后m行每行包含一个单词。(题目中出现的每个单词都只由小写字母组成)

对应Mr. Right看到的每个单词,输出落在字典里的它的变位词的个数。
输入样例

3
tea
ate
eat
3
ate
abc
tea

输出样例

3
0
3

Original: FZUPC 2006

解题:

第一次运用STL解题,感觉不错。方便呀,怎么以前不知道这东东,以后还是要训练用的好。

先将字典排序,例如样例里三个字典排序后都为aet,存在map容器里,关键码即为aet,因为只能存放相同的关键码,所以在值上令为3,具体实现看代码。

#pragma warning(disable:4786)
#include <map>
#include <string>
#include <iostream>
using namespace std;

string change(string a) 
{ 
	int i,j; 
	char k; 
	for(i=1;i<a.length();i++)
	{ 
		k=a[i]; 
		j=i-1; 
		while(j>=0 && a[j]>k)
		{ 
			a[j+1]=a[j]; 
			j--; 
		} 
		a[j+1]=k;		
	} 
	return a;
} 

int main()
{
	int m,n;int count=1;
	string s;
	map < string,int > theWords;
	map < string,int >::iterator iter;	
	cin>>n;
	while(n--)
	{
		cin>>s;
		s=change(s);	
		iter=theWords.find(s);
		if(iter==theWords.end())
		{
			theWords.insert(map < string, int >::value_type(s,1));
		}
		else
			iter->second++;
	}
	cin>>m;
	while(m--)
	{
		cin>>s;
		s=change(s);
		iter=theWords.find(s);
		if(iter==theWords.end())
		{
			cout<<0<<endl;
		}
		else
		{
			cout<<iter->second<<endl;
		}
	}	
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: