题目大意:给一个字符串,判断是否能通过交换字母构成回文,如果能,计算所需的最小交换次数。

  如果字符串中出现奇数次的字母的个数>1,则不能构成回文。然后...就没思路了...看网上说用贪心的思想先从两端开始考虑,决定两端的字母后再缩小问题范围直至字符串长度<=2。可是看网上的代码都是只考虑了两端字母,而没有考虑其他可能的情况,如mdcfamcda,如果两端都变为m的话需要交换3次,两端都变为a的话需要交换4次,可是如果变为d的话只需要交换两次,但是网上的代码没考虑这种情况竟然AC了,为什么?是测试数据的问题还是其中有什么我没看出来的东西?

 #include <cstdio>
#include <cstring> int main()
{
#ifdef LOCAL
freopen("in", "r", stdin);
#endif
int T;
scanf("%d", &T);
char str[];
while (T--)
{
scanf("%s", str);
int cnt[] = {};
for (int i = ; str[i] != '\0'; i++)
cnt[str[i]-'a']++;
int t = ;
for (int i = ; i < ; i++)
if (cnt[i] % ) t++;
if (t > )
{
printf("Impossible\n");
continue;
}
int ans = ;
for (int s = , e = strlen(str)-; s < e; s++, e--)
{
if (str[s] != str[e])
{
int p = s;
while (str[p] != str[e]) p++;
int q = e;
while (str[q] != str[s]) q--;
if (p - s < e - q)
{
ans += p-s;
for (int i = p; i > s; i--)
str[i] = str[i-];
}
else
{
ans += e-q;
for (int i = q; i < e; i++)
str[i] = str[i+];
}
}
}
printf("%d\n", ans);
}
return ;
}

最新文章

  1. bzoj3744 Gty的妹子序列
  2. 裁剪要素出现错误 :HRESULT:0x80040239
  3. HTML Minifier - 灵活的在线 HTML 压缩工具
  4. 一次进程hang住问题分析。。。
  5. C# 常用加密方式
  6. Data Base MongoDB 无法创建抽象类的问题,
  7. 读书笔记 (二) ———Fundamentals of Multiagent Systems with NetLogo Examples by Prof. Jose M Vidal
  8. 有关按位DP
  9. 定时帧:NSTimer和CADisplayLink
  10. LNMP的安装
  11. AutoIt 脚本小试——刷网易云音乐歌单
  12. 联合查询到gridview
  13. hive中的NULL(hive空值处理)
  14. [BJOI2019]删数(线段树)
  15. css3 flex布局结合transform生成一个3D骰子
  16. [转]【ROLLUP】Oracle分组函数之ROLLUP魅力
  17. EditText的监听器和自定义回车事件
  18. 前端 html input标签 placeholder属性 标签上显示内容
  19. 20155327 信息安全技术 实验二 Windows口令破解
  20. 牛客网 牛客练习赛43 C.Tachibana Kanade Loves Review-最小生成树(并查集+Kruskal)+建虚点+读入挂

热门文章

  1. Spring注解基本解读
  2. 打开一个activity,让edittext不获得焦点
  3. string 与wstring 的转换
  4. oracle数据库查询常用语句
  5. 一个mapreduce得到需要计算单词概率的基础数据
  6. View如何设置16进制颜色值
  7. shell中break 与 continue
  8. HDU 5487 Difference of Languages(BFS)
  9. Django之路:简介以及环境
  10. Sublime Text 3 搭建 Golang 开发环境