ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UVA195 Anagram 题解

2022-05-08 21:31:58  阅读:200  来源: 互联网

标签:char int 题解 len 单词 Anagram include 9999999 UVA195


To 题目

主要思路:全排列 + 亿点点小技巧。

不会全排列的可以先把这道题过了 P1706

这道题的难点就在于有重复的单词,只记一次。

第一个想法是将所有以生成的单词记录下来,然后每次判断是否为已存在,但是很明显,你不是 TLE 就是 MLE 有哪位勇士去试一下吗

所以,要换一种做法,记录原单词每个字母出现的次数

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;//共输入n组数据
char s[9999999];//单词
int len;//长度
int used[9999999];//每个字母出现次数
char a[9999999];//原单词
void dfs(int x){
	if(x>len){//如果长度已足
		for(int i=1;i<=len;i++){
			printf("%c",s[i]);//输出
		}
		printf("\n");//换行
		return;//结束函数
	}
	for(int i='A';i<='Z';i++){//枚举字母,不用小写是因为在ASCII码中小写大于大写
		if(used[i]){//如果大写字母可以用
			used[i]--;//减少一次使用次数
			s[x]=i;//此位为i
			dfs(x+1);//确定下一位
			used[i]++;//回溯释放状态
		}
		if(used[i-'A'+'a']){//如果小写字母可以用
			used[i-'A'+'a']--;//减少一次使用次数
			s[x]=i-'A'+'a';//此位为i的小写
			dfs(x+1);//确定下一位
			used[i-'A'+'a']++;//回溯释放状态
		}
	}
}
int main(){
	scanf("%d",&n);//输入n
	while(n--){
		memset(used,0,sizeof(used));//记得初始化
		cin>>a;//输入这个单词
		len=strlen(a);//单词长度
		for(int i=0;i<=len;i++){
			used[a[i]]++;//记录每个字母的可使用次数
		}
		dfs(1);//开始全排列
	}
	return 0;//完结撒花
}

标签:char,int,题解,len,单词,Anagram,include,9999999,UVA195
来源: https://www.cnblogs.com/Mr-Lin-081122/p/16246995.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有