变位词
欢迎进入我的C语言世界
题目
Problem Description
Mr. Right有一个奇怪的嗜好,就是看见一个单词就有找它所有的变位词的冲动。一个单词的变位词就是该单词所有字母的一个排列。
Input
输入数据第一行为一个整数n,1<=n<=10^5,之后n行每行只包含一个单词,不含词组。这些单词构成了Mr. Right的字典。每个单词长度不大于9个字母。接着一行为一个整数m,1<=m<=100,表示Mr. Right将看见的单词数。之后m行每行包含一个单词。(题目中出现的每个单词都只由小写字母组成)
Output
对应Mr. Right看到的每个单词,输出落在字典里的它的变位词的个数。
Sample Input
3
tea
ate
eat
3
ate
abc
tea
Sample Output
3
0
3
答案
下面展示 实现代码
。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
#include <string>
using namespace std;
char a[100007][10];
char b[100007][10];
map<string,int> mm;
int main()
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
scanf("%s",a[i]);
int l = strlen(a[i]);
sort(a[i],a[i]+l);
mm[a[i]]++;
}
int m;
scanf("%d",&m);
for(int i = 0; i < m; i++)
{
scanf("%s",b[i]);
int l = strlen(b[i]);
sort(b[i],b[i]+l);
printf("%d\n",mm[b[i]]);
}
return 0;
}
下面展示 WA代码
。
#include <iostream>
#include <map>
#include <string.h>
using namespace std;
struct node
{
char arr[10];
int sum;
}Node1[1000007],Node2[1000007];
int main()
{
int n;
scanf("%d",&n);
getchar();
for(int i = 0; i < n; i++)
{
memset(Node1[i].arr,0,sizeof(Node1[i].arr));
gets(Node1[i].arr);
int l = strlen(Node1[i].arr);
for(int j = 0; j < l; j++)
{
Node1[i].sum += int(Node1[i].arr[j]);
}
}
int m;
scanf("%d",&m);
getchar();
for(int i = 0; i < m; i++)
{
memset(Node2[i].arr,0,sizeof(Node2[i].arr));
gets(Node2[i].arr);
int l1 = strlen(Node2[i].arr);
for(int j = 0; j < l1; j++)
{
Node2[i].sum += int(Node2[i].arr[j]);
}
int num = 0;
for(int k = 0; k < n; k++)
{
if(Node2[i].sum == Node1[k].sum)
{
num++;
}
}
printf("%d\n",num);
}
return 0;
}
本题感悟
本块内容可能来自课本或其他网站,若涉及侵权问题,请联系我进行删除,谢谢大家啦~
- 一直WA,我想到了用map,但是却没想到sort(),很棒的思路
- 我觉得WA的思路也很棒,但是我不明白哪里WA了,TAT
以上。