题目意思为解码字符串,要输出第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的更多相关文章

  1. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  2. LPS UVA 11404 Palindromic Subsequence

    题目传送门 题意:求LPS (Longest Palidromic Subsequence) 最长回文子序列.和回文串不同,子序列是可以不连续的. 分析:1. 推荐->还有一种写法是用了LCS的 ...

  3. UVA 11404 Palindromic Subsequence

    Palindromic Subsequence Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA ...

  4. 【UVa】Palindromic Subsequence(dp+字典序)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=s ...

  5. uva 10252 - Common Permutation 字符串水题

    题意:給定兩個小寫的字串a與b,請印出皆出現在兩字串中的字母,出現的字母由a~z的順序印出,若同字母出現不只一次,請重複印出但不能超過任一字串中出現的次數.(from Ruby兔) 很水,直接比较输出 ...

  6. UVa 11404 Palindromic Subsequence (LCS)

    题意:给定一个字符串,问删除一些字符,使得它成为一个最长回访串,如果有多个,输出字典序最小的那个. 析: 我们可以把原字符串反转,然后求两个串的LCS,就得到最长回文串,不过要注意一些细节. 代码如下 ...

  7. [题解]UVA11027 Palindromic Permutation

    链接:http://vjudge.net/problem/viewProblem.action?id=19602 描述:给出一个字符串,求重新排列后第n个回文串,若没有则输出"XXX&quo ...

  8. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  9. [LeetCode] Palindrome Permutation II 回文全排列之二

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

随机推荐

  1. c# propertyGrid下拉选项

    实现下面效果的propertygrid属性下拉选择

  2. 向网页中写入js和css

    向网页中写入js和css 本函数由前辈所写 loadFile: function (url, ftype) { var fileref; if (ftype == "js") { ...

  3. 理解WebKit和Chromium(电子书)

    前言   基础篇 WebKit, WebKit2, Chromium和Chrome介绍 WebKit和Blink WebKit和Chromium代码目录结构介绍 WebKit和Chromium功能模块 ...

  4. Spark 倾斜连接

    [数据倾斜出现的原因] 并行计算中,我们总希望分配的每一个任务(task)都能以相似的粒度来切分,且完成时间相差不大.但是由于集群中的硬件和应用的类型不同.切分的数据大小不一,总会导致部分任务极大地拖 ...

  5. tab一些 添加 删除 搜索

    tab一些 添加 删除 搜索 案例 <!DOCTYPE html><html lang="en"><head> <meta charset ...

  6. incallui中如何查询联系人数据

    联系人信息显示在CallCard中,提示当前正在通话的联系人号码.姓名.头像.号码类型等信息: 代码中在两个地方发起对当前联系人的查询, Init():startContactInfoSearch(c ...

  7. javascript动画效果之透明度(修改版)

    在编写多块同时触发运动的时候,发现一个BUG, timer = setInterval(show, 30);本来show是一个自定义函数,当设为timer = setInterval(show(one ...

  8. ios日期时间

    //1.获取当前时间 -(NSString*)getCurrentTime { NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; ...

  9. 关于maven相互依赖的工程部署问题

    环境:win7 64位,myeclipse10.6,eclipse4.5,都配置了svn插件 问题描述:1.工程模块化之后都是通过pom配置model来关联的,svn提交之后,通过myeclipse的 ...

  10. Python中exec的使用

    >>>globals = {'x':7, .....: 'y':10, .....: 'names':['aa','bb','cc'] .....: } >>>lo ...