蓝桥-BASIC-19 完美的代价
2018-03-09 17:41
197 查看
基础练习 完美的代价
问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入
5
mamad
样例输出
3
解释在代码中
问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入
5
mamad
样例输出
3
解释在代码中
#include<iostream> #include<string> using namespace std; int main() { int n,j,flag=0,cnt=0; //flag标记个数为奇数的字符 string str; cin >> n >> str; j=n-1; //控制循环范围 for(int i=0;i<j;i++) { int k=j; while(k&&str[i]!=str[k]) k--; if(i==k) { if(n%2==0||flag) //不可能条件:偶数个字符出现单个字符或出现多个单个字符 { cout << "Impossible"; return 0; } flag=1; //置1表示出现过单个字符 cnt+=n/2-i; //不要移动否则处理起来很麻烦 } else if(str[i]==str[k]) { for(int l=k;l<j;l++) //j表示的是k位置这个字符应该到的位置,不一定是i关于中心对称的位置 { swap(str[l],str[l+1]); cnt++; } j--; //j后面位置的字符已经安排好位置了 } } cout << cnt ; return 0; }
相关文章推荐
- 蓝桥-BASIC-19-完美的代价
- 蓝桥杯 BASIC-19 基础练习 完美的代价
- 基础练习 BASIC-19 完美的代价
- [BASIC-19] 完美的代价
- BASIC-19 VIP试题 完美的代价
- 蓝桥杯 BASIC-19 基础练习 完美的代价 Java版
- 蓝桥杯 BASIC-19 基础练习 完美的代价(有贪心特点)
- 蓝桥杯练习题 BASIC-19 完美的代价(贪心算法)
- [BASIC-19] - 完美的代价 (Unsolved)
- 蓝桥杯BASIC-19(完美的代价)
- BASIC18-21 矩形面积交 完美的代价 数的读法 Sine之舞
- 完美代价
- 蓝桥杯—FJ的字符串 、Sine之舞 、完美的代价
- 基础练习 完美的代价
- 蓝桥—BASIC-13 数列排序
- PAT(Basic Level)_1030_完美数列
- PAT (Basic Level) Practise (中文)-1030. 完美数列(25)
- 蓝桥杯:基础训练——/* 问题描述: 基础练习 完美的代价 时间限制:1.0s 内存限制:512.0MB 问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为
- 完美的代价
- 蓝桥-BASIC-27-2n皇后问题