Problem D: Evil Straw Warts Live

A palindrome is a string of symbols that is equal to itself when reversed. Given an input string, not necessarily a palindrome, compute the number of swaps necessary to transform the string into a palindrome. By  swap  we mean reversing the order of two adjacent symbols. For example, the string "mamad" may be transformed into the palindrome "madam" with 3 swaps:

  • swap "ad" to yield "mamda"
  • swap "md" to yield "madma"
  • swap "ma" to yield "madam"

The first line of input gives n, the number of test cases. For each test case, one line of input follows, containing a string of up to 100 lowercase letters. Output consists of one line per test case. This line will contain the number of swaps, or "Impossible" if it is not possible to transform the input to a palindrome.

Sample Input

3
mamad
asflkj
aabb

Output for Sample Input

3
Impossible
2

题意:给定一些字符串,要求出能否通过交换字母变换为回文。。如果可以输出最少变换次数。。

思路:贪心。。

1、先判断能不能变换为回文。。如果字符串中没有或只有1个字母是奇数。就可以组成。。

2、每次从第一个字母开始。从后往前找到一个相同字母。放到最后就是匹配了。。每次移动的次数为当前位置到最后的位置的距离。

要注意有单个字母为奇数的情况。。最后要把这个字母另外拿出来移到最中间。。一开始没考虑这个wa了- -

代码:

#include <stdio.h>
#include <string.h> int t, len, sum, judge, end, vis[30], mark[105];
char sb[105], v; void Init() {
sum = 0;
judge = 1;
memset(vis, 0, sizeof(vis));
memset(mark, 0, sizeof(mark));
gets(sb);
len = strlen(sb);
end = len - 1;
} void Judge() {//判断能不能组成回文
int bo = 0;
for (int i = 0; i < len; i ++)
vis[sb[i] - 'a'] ++;
for (int i = 0; i < 26; i ++) {
if (vis[i] % 2) {
bo ++;
if (bo == 2) {
judge = 0;
break;
}
v = i + 'a';
}
}
} void solve() {//变换
for (int i = 0; i < len / 2; i ++) {
int j;
for (j = end; j >= i + 1; j --)
if (sb[j] == sb[i]) {
mark[i] = 1;
sum += end - j;
for (int k = j; k < end; k ++)
sb[k] = sb[k + 1];
end --;
break;
}
}
if (len % 2) {//奇数情况
for (int i = 0; i < len; i ++)
if (sb[i] == v && mark[i] == 0) {
sum += len / 2 - i;
break;
}
}
if (judge)
printf("%d\n", sum);
else
printf("Impossible\n");
}
int main() {
scanf("%d%*c", &t);
while (t --) {
Init();
Judge();
solve();
}
return 0;
}

UVA 10716 Evil Straw Warts Live(贪心)的更多相关文章

  1. uva 10716 Evil Straw Warts Live(贪心回文串)

    这道题目我用了一上午才做出来,还是看的别人的思路,尽管没有看代码做的有点慢.代码能力还是得加强啊.思维 得缜密.不能想当然,要有根据,写上的代码要有精确度.省的以后还得慢慢调试 思路:贪心.每次都查看 ...

  2. UVa 10716 - Evil Straw Warts Live

    题目大意:给一个字符串,判断是否能通过交换字母构成回文,如果能,计算所需的最小交换次数. 如果字符串中出现奇数次的字母的个数>1,则不能构成回文.然后...就没思路了...看网上说用贪心的思想先 ...

  3. poj 1854 Evil Straw Warts Live 变成回文要几次

    Evil Straw Warts Live Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1799   Accepted: ...

  4. POJ 1854 - Evil Straw Warts Live

    Description A palindrome is a string of symbols that is equal to itself when reversed. Given an inpu ...

  5. Uva 11729 Commando War (简单贪心)

    Uva 11729  Commando War (简单贪心) There is a war and it doesn't look very promising for your country. N ...

  6. uva 1153 顾客是上帝(贪心)

    uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题 ...

  7. UVA 538 - Balancing Bank Accounts(贪心)

    UVA 538 - Balancing Bank Accounts 题目链接 题意:给定一些人的欠钱关系,要求在n-1次内还清钱,问方案 思路:贪心,处理出每一个人最后钱的状态,然后直接每一个人都和最 ...

  8. UVA 11292 Dragon of Loowater(简单贪心)

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

  9. UVa 11134 - Fabled Rooks 优先队列,贪心 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

随机推荐

  1. jqery选择器

    根据可见性 属性 匹配元素 <!doctype html> <html lang="en"> <head> <meta charset=& ...

  2. 20151215jqueryUI--dialog代码备份

    $(function () { $('#search_button').button(); /*$('#reg_a').click(function() { $('#reg').dialog(); } ...

  3. hadoop_集群安装_1

    这篇文章中主要介绍的是,如何基于VM安装Linux,以及如何在安装好Linux之后,基于操作系统安装VMTools. 在安装之前,应该先规划好 每个node*的IP地址,以及 hostname: no ...

  4. Mac OS X 配置环境变量

    /etc/profile:/etc/bashrc 是针对系统所有用户的全局变量,只有root用户才能修改这两个文件,对一般用户来说是他们是只读的.一般用户要想修改它们,可以在命令前加sudo,意思是以 ...

  5. UIPanGestureRecognizer的使用

    UIGestureRecognizer是一个定义基本手势的抽象类,具体什么手势,在以下子类中包含: 1.拍击UITapGestureRecognizer (任意次数的拍击)      2.向里或向外捏 ...

  6. IOS 学习笔记 2015-04-08 OC-NSUserDefaults 持久化对象

    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的; NSUserDefaults被设计用来存储设备和应用的配置信息,它通过一个工厂方法返回默认的. ...

  7. ubuntu intelliJ IDEA 12.1.4 安装

    1 php插件 http://plugins.jetbrains.com/plugin/?id=6610 把插件下载到一个目录下,如果插件不兼容,多试几个版本! 2 打开ide, FILE -> ...

  8. 关于学习HTML5中自己犯的错误

    7.1写错了 siblings()这个函数写成了sibling,在jQuery中并没有这个函数的定义 在查找错误的过程中,自己也发现了一个学习jQuery的网站http://www.365mini.c ...

  9. EF初始化mysql数据库codefirst

    EF使用Code First修改生成数据库表名的方法 1. 重写OnModelCreating,去掉表名复数 System.Data.Entity.ModelConfiguration.Convent ...

  10. SQL VIEW(视图)

    1,视图包含行和列,就像一个真实的表. 2,视图中的字段就是来自一个或多个数据库中的真实的表中的字段. 3,我们可以向视图添加 SQL 函数.WHERE 以及 JOIN 语句,我们也可以提交数据,就像 ...