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 ...
随机推荐
- Linux入门(二)Linux基本命令及基本操作
1 常用Linux命令 图形界面进入到字符界面: ctrl+alt+F2~F6 字符界面进入到图形界面:ctrl +alt+F7 查看本机ip: ifconfig (windows是:ipconf ...
- dbvisualizer参数设置
6.13 可否完全禁用数据编辑? 可以. 方法: 在文本编辑器里打开文件 DBVIS-HOME/resources/dbvis-custom.prefs. 找出 dbvis.disabledataed ...
- 我使用的Bash脚本模板
在Linux环境下(包括在相应的模拟环境,如Windows中的Cygwin)工作的时间久了,就会慢慢积累出一些自己写的小脚本程序,用于加速日常的操作与工作流程,如自动挂载与卸载U盘,映射网络驱动器,数 ...
- ***1133. Fibonacci Sequence(斐波那契数列,二分,数论)
1133. Fibonacci Sequence Time limit: 1.0 secondMemory limit: 64 MB is an infinite sequence of intege ...
- 表单提交是ajax提交,PC提交没问题但是手机提交就会一直跳到error,并且也没状态码一直是0
真是被自己蠢死了button标签他会自动提交刷新页面 <form id="baoming_from"> <p>请填写您的个人信息</p> < ...
- 灰色关联度Matlab代码
load x.txt %把原始数据存放在纯文本文件x.txt中,其中把数据的"替换替换成. for i=1:40x(i,:)=x(i,:)/x(i,1); %标准化数据end data=x; ...
- js移动端tap事件封装
这几天做项目,发现移动端需要触摸事件,而click肯定是不行的,于是我对tap事件封装进行了搜索,找到了一篇文章,原文地址如下:http://www.jb51.net/article/50663.ht ...
- 常用 ajax js 表单
$(function () { /** * 图片点击放大处理 */ $('.mini_img').click(function () { $(this).hide().next().show(); } ...
- JavaScript 事件 事件流 事件对象 事件处理程序 回调函数 error和try...catch和throw
参考资料: 慕课网 DOM事件探秘 js事件对象 处理 事件驱动: JS是采用事件驱动的机制来响应用户操作的,也就是说当用户对某个html元素进行操作的时候,会产生一个时间,该时间会驱动某些函数 ...
- ios沙盒查找图片展示
iOS如何找到自己的沙盒 在ios开发我们会用到沙盒,由于自己对沙盒理解的不够,所以找不到沙盒文件在哪里,当然要知道路径了 例如我的路径 NSString* cachepath = [NSHomeDi ...