51nod 2级算法题-1095
2017-04-25 11:57
253 查看
1095 Anigram单词
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的Anigram,例如单词army和mary互为Anigram。现在给定一个字典,输入Q个单词,从给出的字典中找出这些单词的Anigram。
Input
第1行:1个数N,表示字典中单词的数量。(1 <= N <= 10000) 第2 - N + 1行,字典中的单词,单词长度 <= 10。 第N + 2行:查询的数量Q。(1 <= Q <= 10000) 第N + 3 - N + Q - 2行:用作查询的单词,单词长度 <= 10。
Output
共Q行,输出Anigram的数量,相同的2个单词不算Anigram,如果没有输出0。
Input示例
5 add dad bad cad did 3 add cac dda
Output示例
1 0 2
hash一下解决字符串问题,注意取质数P的时候,不能小了。这里应该是有大小写的问题吧。
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <queue> #include <stack> using namespace std; #define endl "\n" const int MOD=100000031; const int maxn=1e4+100; string a[maxn]; long long hh[maxn]; int T[60]; int Exo[60]; #define p 59 int main () { Exo[0]=1; Exo[1]=p; for(int i=2;i<60;i++){ Exo[i]=(Exo[i-1]*p%MOD+MOD)%MOD; } int N; cin>>N; char ch; for(int i=0;i<N;i++){ cin>>a[i]; ch='A'; memset(T,0,sizeof(T)); for(int j=0;j<a[i].size();j++){ T[a[i][j]-'A']++; } for(int j=0;j<60;j++){ hh[i]+=(((T[j])*Exo[j])%MOD+MOD)%MOD; } } int Q; cin>>Q; int h=0; while(Q--){ string str; cin>>str; long long mm=0; memset(T,0,sizeof(T)); ch='A'; for(int j=0;j<str.size();j++){ T[str[j]-ch]++; } for(int i=0;i<60;i++){ mm+=(((T[i])*Exo[i])%MOD+MOD)%MOD; } int sum=0; for(int i=0;i<N;i++){ if(a[i]==str){ continue; } if(hh[i]==mm){ sum++; } } cout<<sum<<endl; } }
相关文章推荐
- 51nod 2级算法题-1014
- 51nod 2级算法题-1050
- 【模拟】1432 独木舟【51nod】【难度:2级算法题】
- 51nod 2级算法题-1062
- 51nod 2级算法题-1126
- 51nod 2级算法题-1133
- 51nod 2级算法题-1092
- 51nod 2级算法题-1279
- 51nod 2级算法题-1119
- 51nod 2级算法题-1315
- 51nod 2级算法题-1007
- 51nod 2级算法题-1428
- 【贪心+优先队列】1428 活动安排问题【51nod】【难度:2级算法题】
- 51nod 2级算法题-1010
- 51nod 1160 压缩算法的矩阵
- 51nod -- 1002 数塔取数问题(一级算法题)
- 51nod --1004 n^n的末位数字(一级算法题)
- 51nod算法马拉松20
- 贪心算法基础之完美字符串 51nod 贪心总结
- 51nod 1785 数据流中的算法