UVA 11027 - Palindromic Permutation
题目意思为解码字符串,要输出第n个回文字符串,因为对称关系,前一半确定了,后一半也就跟着确定了,所以n其实就是前一半字符串的编码,还要减去1,直接解码出来再复制给后半即可
#include<cstdio>
#include<cstring>
#include<iostream> using namespace std; typedef long long ll; int T,a[],st[],cas=,len;
ll n;
char s[]; ll fa(int &x)//阶乘
{
ll res=;
for(int i=;i<=x;i++)
res*=i;
return res;
} ll f(int*st)//种数
{
ll x=,y=;
int sum=;
for(int i=;i<;i++)
{
if(st[i]>) y*=fa(st[i]);
sum+=st[i];
}
x=fa(sum);
return x/y;
} ll code(char*s,int *st)//编码,这里没用到,开始理解错题意,以为是大于给出字符串的第n个回文字符串,打了一大堆才发现理解错题意了,main函数中的已删除,编码的就留着
{
ll x=;
for(int i=;i<len>>;i++)
{
int cnt=;
st[s[i]-'a']--;
for(int j=i+;j<len>>;j++) if(s[j]<s[i]) cnt++;
x+=cnt*f(st);
}
return x;
} void decode(ll &goal,int*st)//解码
{
int l=len>>;
for(int i=;i<l;i++)
{
ll x=;
for(int j=;j<;j++)
{
if(!st[j]) continue;
st[j]--;
ll y=f(st);
x+=y;
if(goal<x)//比如a开头的有6种,b开头的有3种,要找第八种,则应该是b开头的
{
s[i]=j+'a';
goal-=x-y;
break;
}
else st[j]++;
}
}
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s%lld",s,&n);
printf("Case %d: ",cas++);
memset(a,,sizeof(a));
int i,x;
len=strlen(s);
for(i=;i<len;i++)
a[s[i]-'a']++;
i=;
if(len&)
{
for(;i<;i++)
{
if(a[i]&)
{
a[i]>>=;
x=i;//x记下长度为奇数时中间那个
break;
}
a[i]>>=;
}
i++;
}
for(;i<;i++)
{
if(a[i]&) break;
a[i]>>=;
}
if(i<)
{
puts("XXX");
continue;
}
ll goal,all;//最大可能是(30/2)!,超出了int范围,要用ll
all=f(a);
goal=n-;
if(goal>=all) strcpy(s,"XXX");
else
{
decode(goal,a);
for(int i=;i<len>>;i++)
s[len-i-]=s[i];
if(len&) s[len>>]=x+'a';
}
puts(s);
}
return ;
}
UVA 11027 - Palindromic Permutation的更多相关文章
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- LPS UVA 11404 Palindromic Subsequence
题目传送门 题意:求LPS (Longest Palidromic Subsequence) 最长回文子序列.和回文串不同,子序列是可以不连续的. 分析:1. 推荐->还有一种写法是用了LCS的 ...
- UVA 11404 Palindromic Subsequence
Palindromic Subsequence Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA ...
- 【UVa】Palindromic Subsequence(dp+字典序)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=s ...
- uva 10252 - Common Permutation 字符串水题
题意:給定兩個小寫的字串a與b,請印出皆出現在兩字串中的字母,出現的字母由a~z的順序印出,若同字母出現不只一次,請重複印出但不能超過任一字串中出現的次數.(from Ruby兔) 很水,直接比较输出 ...
- UVa 11404 Palindromic Subsequence (LCS)
题意:给定一个字符串,问删除一些字符,使得它成为一个最长回访串,如果有多个,输出字典序最小的那个. 析: 我们可以把原字符串反转,然后求两个串的LCS,就得到最长回文串,不过要注意一些细节. 代码如下 ...
- [题解]UVA11027 Palindromic Permutation
链接:http://vjudge.net/problem/viewProblem.action?id=19602 描述:给出一个字符串,求重新排列后第n个回文串,若没有则输出"XXX&quo ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- [LeetCode] Palindrome Permutation II 回文全排列之二
Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...
随机推荐
- 判断浏览器是否支持html5和css3属性
本文章内容是由一个前辈写的. CSS3特有的属性moz-Transform //判断是否具有相应属性 testProps: function (props) { var i; for (i in pr ...
- mysql解决中文乱码问题
安装文件 my.ini default-character-set=gbk 安装文件 db.opt default-character-set=gbkdefault-collation=gbk_chi ...
- php和js的转成整数的方法
1.将变量转成整数类型php: intval(7/2)js:parseInt(7/2)2.向上取整,有小数就整数部分加1php: ceil(7/2)js: Math.ceil(7/2)3,四舍五入.p ...
- Makefile:130: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.
修改了snmp里面的包Makefile,出现了如下问题: Makefile:130: *** missing separator (did you mean TAB instead of 8 spac ...
- C语言中字符串
#include <stdio.h> int main(){ char s[] = "ABCD"; char *p; for(p=s; p<s+4; p++) { ...
- HDU 4520 小Q系列故事――最佳裁判(STL)
小Q系列故事——最佳裁判 Problem Description 过去的2012年对小Q来说是很悲催的一年,失恋了12次,每次都要郁闷1个来月. 好在小Q是个体育迷,在最痛苦的时候,他常常用观看各种体 ...
- BestCoder Round #86 A B C
这次BC终于不像上次一样惨烈 终于A了三题…… 终测ing…… 发一波题解…… A.Price List A题十分无脑 只要把所有数加起来存到sum里 询问的时候大于sum输出1 否则输出0就行了…… ...
- HDU1503:Advanced Fruits(LCS)
Problem Description The company "21st Century Fruits" has specialized in creating new sort ...
- css3的特效拓展...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- php 实现简易模板引擎
1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Model(模型)表示应用程序核心 ...