1095 Anigram单词

一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的Anigram,例如单词army和mary互为Anigram。另:相同的2个单词不算Anigram。现在给定一个字典,输入Q个单词,从给出的字典中找出这些单词的Anigram。

 收起

输入


第1行:1个数N,表示字典中单词的数量。(1 <= N <= 10000) 第2 - N + 1行,字典中的单词,单词长度 <= 10。 第N + 2行:查询的数量Q。(1 <= Q <= 10000) 第N + 3 - N + Q - 2行:用作查询的单词,单词长度 <= 10。


输出


共Q行,输出Anigram的数量,如果没有输出0。


输入样例


5 add dad bad cad did 3 add cac dda


输出样例


1 0 2


思路 :  这个题用 map 真香! 一开始没想到(老长时间没刷题脑壳痛) , 将 所有字符相同长度相同的字符串等价为1个 , 先统计一下原来的字符串,再统计一下等价字符串,每次查询用该字符串的"等价字符串"个数 - 原来字符串个数 。

#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std ;
typedef long long LL;
const LL inf = 0x3f3f3f3f3f3f3f3f;
const LL maxn = 1e18+999 ;
const int MAX = 50005 ;

map<string,int> a1 ,a2;
int n ,q ;
int main () {

cin >> n ;
for(int i = 1 ; i<=n ; i++ ) {
string s ;
cin >> s ;
a1[s]++ ; // 原来的字符串
sort(s.begin(),s.end()) ;
a2[s]++ ; // 等价之后的个数
}

cin >>q ;
while(q--) {
string s ,t ;
cin >> s ;
t = s ;
sort(s.begin(),s.end()) ;
cout<<a2[s]-a1[t] <<endl;
}
return 0 ;

}