FZU 1410 变位词

 

变位词
Time Limit:1s Memory limit:32M
Accepted Submit:310 Total 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; }

你可能感兴趣的:(String,iterator,stdstring)