51nod 1095 Anigram单词【hash/map/排序/字典树】

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

【分析】:一个map记录相同的(因为相同的2个单词不算Anigram,要减掉),一个记录排序后得到相同的单词。两者差值为Anigram的数量。【代码】:

#include <bits/stdc++.h>

using namespace std;
#define inf 1e18+100
#define LL long long

const int maxn = 20;

int main()
{
    int  n,nn,x,y;
    char s[maxn],ss[maxn];
    map<string,int>m1,m2;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%s",s);
        m1[s]++;
        sort(s,s+strlen(s));
        m2[s]++;
    }
    cin>>nn;
    for(int i=0;i<nn;i++)
    {
       scanf("%s",ss);
        x=m1[ss];
        sort(ss,ss+strlen(ss));
        y=m2[ss];
        cout<<y-x<<endl;
    }
}

时间: 2024-10-13 11:50:57

51nod 1095 Anigram单词【hash/map/排序/字典树】的相关文章

51Nod 1095 Anigram单词 | Hash

Input示例 5 add dad bad cad did 3 add cac dda Output示例 1 0 2 #include <iostream> #include <string.h> #include <algorithm> #include <map> using namespace std; #define MAXN 10001 char s[2*MAXN][15]; char str[15]; map<string,int>

51nod 1095 Anigram单词

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1095 竟然错了10次,最后还是用字典树搞过去的,不过这题解法很多,二分,哈希,STL,排序 都可以搞. 字典树建树的时候保存节点出现的次数,因为可能大小写都有,所以开next[52]的数组足够了. 题目关键是相同字符串不能算,那么可以用map统计出现次数最后减去这个即可. 还有就是查找的时候,边查找边记数一直到字符串的结尾,并且如果还有分支的话那么需要减去分支的数,因为

HDU 1075 map or 字典树

What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others)Total Submission(s): 12773    Accepted Submission(s): 4069 Problem Description Ignatius is so lucky that he met a Martian yesterday. But

1095 Anigram单词(51nod)

原题链接:http://www.51nod.com/onlineJudge/questionCode.html#problemId=1095&noticeId=20791 老实说这题,我是很不想用字典树,因为不熟~~~但后来没搞出来,就用了字典树..........当然得参考一下大神的代码. 解法:用map统计相同单词... 然后把字符串按字典序排序,然后把字符串插入到字典树里面去 #include<stdio.h> #include<string.h> #include&

[51NOD1095] Anigram单词(map)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1095 字典的单词在map中排序和不排序各存1次,查的时候相减. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 10100; 5 int n, q; 6 char tmp[12]; 7 map<string, int> d1; 8 map<stri

[POJ] #1003# 487-3279 : 桶排序/字典树(Trie树)/快速排序

一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 Description Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or

HDU 1075 What Are You Talking About(map或字典树)

What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others)Total Submission(s): 24624    Accepted Submission(s): 8280 Problem Description Ignatius is so lucky that he met a Martian yesterday. But

51nod round3# 序列分解(折半枚举+字典树)

小刀和大刀是双胞胎兄弟.今天他们玩一个有意思的游戏. 大刀给小刀准备了一个长度为n的整数序列.小刀试着把这个序列分解成两个长度为n/2的子序列. 这两个子序列必须满足以下两个条件: 1.他们不能相互重叠. 2.他们要完全一样. 如果小刀可以分解成功,大刀会给小刀一些糖果. 然而这个问题对于小刀来说太难了.他想请你来帮忙. Input 第一行给出一个T,表示T组数据.(1<=T<=5) 接下来每一组数据,输入共2行. 第一行包含一个整数n (2<=n<=40且为偶数). 第二行给出n

POJ_2503_Babelfish(map or 字典树)

Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 34816   Accepted: 14908 Description You have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language. Fortunately, you have