C语言之变位词

欢迎进入我的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;
} 
 

本题感悟

本块内容可能来自课本或其他网站,若涉及侵权问题,请联系我进行删除,谢谢大家啦~

  1. 一直WA,我想到了用map,但是却没想到sort(),很棒的思路
  2. 我觉得WA的思路也很棒,但是我不明白哪里WA了,TAT

以上。

猜你喜欢

转载自blog.csdn.net/hongguoya/article/details/106554886