Codeforces 600C Make Palindrome 【贪心 找字典序最小回文串】
来源:互联网 发布:鬼谷战术风雨家淘宝 编辑:程序博客网 时间:2024/05/17 08:08
题意:给定一个只包含小写字母的字符串,你可以修改任意位置的字符(变换为a-z中任一个),然后重新排列字符串。现在要求用最少次数的修改得到一个回文串,若有多种方案,输出字典序最小的方案。
思路:找出并记录所有字母的出现次数num[],若num[i] & 1说明该字母不能对称放置,这时有两种方案——1,需要把其它字母改为当前字母;2,把该字母改为其它字母。为了得到最小字典序,我们贪心的选择将字典序大的字母改为字典序小的字母,按照这样的思维模拟即可。
注意:串长度len & 1时的处理。
AC代码:
#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <vector>#define INF 0x3f3f3f#define eps 1e-8#define MAXN (200000+10)#define MAXM (100000)#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%.2lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define LL long long#define lson o<<1, l, mid#define rson o<<1|1, mid+1, r#define ll o<<1#define rr o<<1|1using namespace std;char str[MAXN]; int num[30];bool mark[30];int main(){ Rs(str); CLR(num, 0); int len = strlen(str); for(int i = 0; i < len; i++) num[str[i]-'a']++; CLR(mark, false); int cnt = 0; for(int i = 0; i < 26; i++) if(num[i] & 1) mark[i] = true, cnt++; char mid; int use = 0; if(len & 1) { cnt--; for(int i = 0; i <= 25; i++) { if(mark[i]) use++; if(use > cnt / 2) { mid = 'a' + i; mark[i] = false; break; } } } bool flag = false; use = 0; for(int i = 0; i <= 25; i++) { if(mark[i]) { if(flag) num[i]--; else num[i]++; use++; } if(use == cnt / 2) flag = true; } int F = 0, B = len-1; for(int i = 0; i < 26; i++) { for(int j = F; j < F + num[i] / 2; j++) str[j] = 'a' + i; F += num[i] / 2; for(int j = B; j > B - num[i] / 2; j--) str[j] = 'a' + i; B -= num[i] / 2; } if(len & 1) str[len / 2] = mid; Ps(str); return 0;}
0 0
- Codeforces 600C Make Palindrome 【贪心 找字典序最小回文串】
- CodeForces 600C Make Palindrome 贪心
- codeforces 600C. Make Palindrome(贪心)
- Educational Codeforces Round 2 C. Make Palindrome —— 贪心 + 回文串
- Educational Codeforces Round 2C. Make Palindrome(贪心构造)
- Educational Codeforces Round 2 C.Make Palindrome(贪心)
- codeforces 486C Palindrome Transformation 贪心求构造回文
- codeforces 486C Palindrome Transformation 贪心求构造回文
- CodeForces 600C Make Palindrome (模拟题)
- 【Codeforces 600C. Make Palindrome】& 构造
- 【Educational Codeforces Round 2C】【贪心】最少修改数下得到字典序尽可能小回文串
- Educational Codeforces Round 2 600C Make Palindrome(脑洞)
- CodeForces 486C Palindrome Transformation(回文串)
- uva 10453 Make Palindrome(dp,最小回文生成)
- Make Palindrome+uva+回文串dp
- Educational Codeforces Round 2-C. Make Palindrome
- Codeforces Round #389 (Div. 2) D. Santa Claus and a Palindrome 回文串+贪心+数据结构、字符串
- Codeforces 486C Palindrome Transformation(贪心)
- 《剑指offer》——把二叉树打印成多行
- Linux USB驱动数据结构
- 汉诺塔问题
- 关于LinerLayout分割线Divider
- hdoj Friendship of Frog 5578 (简单字符串转换)
- Codeforces 600C Make Palindrome 【贪心 找字典序最小回文串】
- 标准C的IO
- Hadoop2.7.1集群安装
- 进程与线程的区别(面试高频问题)
- javax.xml.ws.soap.SOAPFaultException: Cannot create a secure XMLInputFactory
- 数据链路层的是三个基本问题
- AndroidStudio与GitHub
- 九度OJ 1352:和为S的两个数字 (查找)
- 单线程读fifo写文件