链接:http://vjudge.net/problem/viewProblem.action?id=19602

描述:给出一个字符串,求重新排列后第n个回文串,若没有则输出”XXX“。

思路:组合数问题。

首先考虑什么时候有回文串。很简单,数量为奇数的字母不超过1个。且这个字母只能是在字符串的中间。

然后我们会发现,回文串的字典序就是字串前半部分的字典序。问题就转化成求字典序第n的字符串。于是我们可以试着模拟一下这个过程。首先把字典序最小的字母放在第一个位置,然后计算出后面字母的排列数,即固定下第一个位置后有多少种字符串,设这个数是Num。如果Num>=n,则第一个位置就确定了,继续考虑第二个位置;如果Num<n,则第一个位置的字母不合适,n-=Num,更换成字典序第二的字母,重复上述计算。如果一直是Num<n,则无解。

PS.zyy的数学不好,说得有点啰嗦,请各位大神不吝指教~

下面是我的实现:

  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 using namespace std;
6 #define MaxLen 30
7 int T,N;
8 int Cnt[30],Lit;
9 char str[MaxLen+5],Ans[MaxLen+5];
10 bool flag;
11 inline int fac(int t)
12 {
13 if(t<=2)
14 return t;
15 int i,Ret=1;
16 for(i=2;i<=t;i++)
17 Ret*=i;
18 return Ret;
19 }
20 inline int Arg()
21 {
22 int i,Sum=0;
23 for(i=1;i<=26;i++)
24 {
25 if(!Cnt[i])
26 continue;
27 Sum+=Cnt[i];
28 }
29 Sum=fac(Sum);
30 for(i=1;i<=26;i++)
31 {
32 if(!Cnt[i])
33 continue;
34 Sum/=fac(Cnt[i]);
35 }
36 return Sum;
37 }
38 void Work(int pos,int n)
39 {
40 int i,Num;
41 for(i=1;i<=26;)
42 {
43 if(!Cnt[i])
44 {
45 i++; continue;
46 }
47 Cnt[i]--;
48 Num=Arg();
49 if(Num==0)
50 {
51 Ans[pos]='a'+i-1;
52 return;
53 }
54 else if(Num<n)
55 {
56 Cnt[i]++;
57 i++;
58 n-=Num;
59 }
60 else
61 {
62 Ans[pos]='a'+i-1;
63 Work(pos+1,n);
64 return;
65 }
66 }
67 flag=false;
68 }
69 int main()
70 {
71 int Len,i,JS;
72 scanf("%d",&T);
73 for(int t=1;t<=T;t++)
74 {
75 printf("Case %d: ",t);
76 scanf("%s",str); scanf("%d",&N);
77 Len=strlen(str); Lit=(Len+1)/2;
78 if(Len==1)
79 {
80 if(N==1)
81 printf("%s\n",str);
82 else
83 printf("XXX\n");
84 continue;
85 }
86 memset(Cnt,0,sizeof(Cnt));
87 for(i=0;i<Len;i++)
88 Cnt[str[i]-'a'+1]++;
89 JS=0;
90 for(i=1;i<=26;i++)
91 {
92 if(Cnt[i]%2)
93 {
94 JS++;
95 Ans[Lit]='a'+i-1;
96 }
97 Cnt[i]/=2;
98 }
99 if(JS>=2)
100 {
101 printf("XXX\n");
102 continue;
103 }
104 flag=true;
105 Work(1,N);
106 if(!flag)
107 printf("XXX\n");
108 else
109 {
110 for(i=1;i<=Lit;i++)
111 printf("%c",Ans[i]);
112 if(Lit*2==Len)
113 for(i=Lit;i>=1;i--)
114 printf("%c",Ans[i]);
115 else
116 for(i=Lit-1;i>=1;i--)
117 printf("%c",Ans[i]);
118 printf("\n");
119 }
120 }
121 return 0;
122 }

[题解]UVA11027 Palindromic Permutation的更多相关文章

  1. 【题解】CF359B Permutation

    [题解]CF359B Permutation 求一个长度为\(2n\)的序列,满足\(\Sigma |a_{2i}-a_{2i-1}|-|\Sigma a_{2i}-a_{2i-1}|=2k\) 这种 ...

  2. LeetCode(3)题解: Longest Palindromic Substring

    https://leetcode.com/problems/longest-palindromic-substring/ 题目: Given a string S, find the longest ...

  3. LeetCode题解——Longest Palindromic Substring

    题目: 给定一个字符串S,返回S中最长的回文子串.S最长为1000,且最长回文子串是唯一. 解法: ①遍历,对于每个字符,计算以它为中心的回文子串长度(长度为奇数),同时计算以它和右边相邻字符为中心的 ...

  4. UVA 11027 - Palindromic Permutation

    题目意思为解码字符串,要输出第n个回文字符串,因为对称关系,前一半确定了,后一半也就跟着确定了,所以n其实就是前一半字符串的编码,还要减去1,直接解码出来再复制给后半即可 #include<cs ...

  5. LeetCode题解之Palindromic Substrings

    1.问题描述 2.问题分析 对于每一个字符,以该字符为中心计算回文个数. 3.代码 int countSubstrings(string s) { ; ) ; ; i < s.size(); i ...

  6. PAT甲题题解-1024. Palindromic Number (25)-大数运算

    大数据加法给一个数num和最大迭代数k每次num=num+num的倒序,判断此时的num是否是回文数字,是则输出此时的数字和迭代次数如果k次结束还没找到回文数字,输出此时的数字和k 如果num一开始是 ...

  7. leetcode个人题解——#31 Next Permutation

    写这题时脑子比较混乱,重写了一遍wiki大佬的解法. 算法: According to Wikipedia, a man named Narayana Pandita presented the fo ...

  8. LeetCode Palindrome Permutation II

    原题链接在这里:https://leetcode.com/problems/palindrome-permutation-ii/ 题目: Given a string s, return all th ...

  9. 267. Palindrome Permutation II

    题目: Given a string s, return all the palindromic permutations (without duplicates) of it. Return an ...

随机推荐

  1. HTTP API认证授权方案

    目录 一.需求背景 二.常用的API认证技术 2.1 App Secret Key + HMAC 2.2 OAuth 2.0 2.2.1 Authorization Code Flow 2.2.2 C ...

  2. JavaFx 实现按钮防抖

    原文地址:JavaFx 实现按钮防抖 | Stars-One的杂货小窝 Android平台的APP,一般是有需要进行设置按钮的防抖(即在短时间内无法多次点击),我想在JavaFx项目中也是实现防抖功能 ...

  3. golang中自定义一些类型和对应类型的指针方法

    package main import "fmt" // 项目开发中可以为type声明的类型编写一些方法,从而实现对象.方法的操作 // 声明类型 type myInt int / ...

  4. MySQL基本数据类型之枚举与集合类型

    目录 一:枚举 1.枚举 2.创建表(使用枚举) 3.表内添加数据 二:集合 1.集合 2.创建表(使用集合) 3.表内添加数据 一:枚举 1.枚举 枚举作用: 提前定义好数据之后 后续录入只能录定义 ...

  5. 什么是VRRP?

    目录 一:什么是VRRP? 二:为什么需要VRRP 三:VRRP的工作原理 1.VRRP的三种状态 2.VRRP选举机制 3.VRRP工作原理 四:VRRP的详细工作过程如下: 五:VRRP应用场景 ...

  6. SIFT,SuperPoint在图像特征提取上的对比实验

    SIFT,SuperPoint都具有提取图片特征点,并且输出特征描述子的特性,本篇文章从特征点的提取数量,特征点的正确匹配数量来探索一下二者的优劣. 视角变化较大的情况下 原图1 原图2 SuperP ...

  7. 使用Docker快速搭建Halo个人博客到阿里云服务器上[附加主题和使用域名访问]

    一.前言 小编买了一个服务器也是一直想整个网站,一直在摸索,看了能够快速搭建博客系统的教程.总结了有以下几种方式,大家按照自己喜欢的去搭建: halo wordpress hexo vuepress ...

  8. Activity 不只有跳转。功能篇(一)

    Activity生命周期 1:activity四种启动方式 standard,SingleTask,SingleTop,SingleInstance standard:是系统默认的,每次启动该acti ...

  9. Java中命名Dao、Bean、conn等包的含义(不定期补充)

    感谢大佬:https://blog.csdn.net/j904538808/article/details/78904732 (1)DAO是Data Access Object数据访问接口.数据访问: ...

  10. CentOS 6.4x64安装部署zabbix-2.4.5

    以下内容来自于http://www.iyunv.com/thread-62087-1-1.html 补充一点,按照原文安装万之后zabbix页面会提示 zabbix server is not run ...