题目链接:http://codeforces.com/contest/752/problem/D

题意:给长度为k的n个字符串,每一个字符串有权值,求构造一个大回文串。使得权值最大。

因为字符串长度都一样,所以想构成回文串,必须两两配对,在中间加或者不加一个本身就是回文的字符串。

1.考虑非回文串的配对,把所有可以构成回文的非回文串凑起来,必须两两权值和>0才有意义。那么就扔到优先队列里配对。

2.考虑回文串的配对,配对成功的话要看下是不是两个回文串都是>0,如果不是,要额外在一个vector里记下,方便后面用。

3.这时候挑一个>0的,备选放在中间。

比较上面的2.3,求最优。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. typedef pair<LL, LL> pll;
  6. const int maxn = ;
  7. int n, k, tmp;
  8. char s[maxn];
  9. vector<string> str, rev;
  10. map<string, priority_queue<LL> > wt;
  11.  
  12. int main() {
  13. // freopen("in", "r", stdin);
  14. while(~scanf("%d%d",&n, &k)) {
  15. wt.clear(); str.clear(); rev.clear();
  16. for(int i = ; i < n; i++) {
  17. scanf("%s %d", s, &tmp);
  18. str.push_back(s);
  19. rev.push_back(s);
  20. reverse(rev[i].begin(), rev[i].end());
  21. wt[s].push(tmp);
  22. }
  23. LL ret = ;
  24. for(int i = ; i < str.size(); i++) {
  25. if(str[i] != rev[i]) {
  26. while(wt[str[i]].size() > && wt[rev[i]].size() > ) {
  27. int x = wt[str[i]].top();
  28. wt[str[i]].pop();
  29. int y = wt[rev[i]].top();
  30. wt[rev[i]].pop();
  31. if(x + y > ) ret += x + y;
  32. else {
  33. if(x > ) wt[str[i]].push(x);
  34. if(y > ) wt[rev[i]].push(y);
  35. break;
  36. }
  37. }
  38. }
  39. }
  40. vector<pll> tmp;
  41. for(int i = ; i < str.size(); i++) {
  42. if(str[i] == rev[i]) {
  43. while(wt[str[i]].size() > ) {
  44. int x = wt[str[i]].top();
  45. wt[str[i]].pop();
  46. int y = wt[str[i]].top();
  47. wt[str[i]].pop();
  48. if(x + y > ) {
  49. ret += x + y;
  50. if(x > && y > ) continue;
  51. if(x > y) swap(x, y);
  52. tmp.push_back(pll(x, y));
  53. }
  54. else {
  55. if(x > ) wt[str[i]].push(x);
  56. if(y > ) wt[str[i]].push(y);
  57. break;
  58. }
  59. }
  60. }
  61. }
  62. LL aa = maxn, bb;
  63. for(int i = ; i < tmp.size(); i++) {
  64. if(tmp[i].first < aa) {
  65. aa = tmp[i].first;
  66. bb = tmp[i].second;
  67. }
  68. // cout << tmp[i].first << " " << tmp[i].second << endl;
  69. }
  70. LL qq = ;
  71. for(int i = ; i < str.size(); i++) {
  72. if(str[i] == rev[i]) {
  73. if(wt[str[i]].size() > ) {
  74. if(wt[str[i]].top() > ) {
  75. qq = max(qq, wt[str[i]].top());
  76. }
  77. }
  78. }
  79. }
  80. if(aa == maxn) cout << max(ret + qq, ret) << endl;
  81. else cout << max(max(ret, ret + qq), ret - LL(aa)) << endl;
  82. }
  83. return ;
  84. }

[CF752D]Santa Claus and a Palindrome(优先队列,贪心乱搞)的更多相关文章

  1. Santa Claus and a Palindrome

    Santa Claus and a Palindrome 题目链接:http://codeforces.com/contest/752/problem/D 贪心 很自然地,可以想到,若subS不是回文 ...

  2. Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) D. Santa Claus and a Palindrome STL

    D. Santa Claus and a Palindrome time limit per test 2 seconds memory limit per test 256 megabytes in ...

  3. 【Codeforces752D】Santa Claus and a Palindrome [STL]

    Santa Claus and a Palindrome Time Limit: 20 Sec  Memory Limit: 512 MB Description 有k个串,串长都是n,每个串有一个a ...

  4. Codeforces Round #389 Div.2 D. Santa Claus and a Palindrome

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  5. CodeForces - 748D Santa Claus and a Palindrome (贪心+构造)

    题意:给定k个长度为n的字符串,每个字符串有一个魅力值ai,在k个字符串中选取字符串组成回文串,使得组成的回文串魅力值最大. 分析: 1.若某字符串不是回文串a,但有与之对称的串b,将串a和串b所有的 ...

  6. Codeforces 748D Santa Claus and a Palindrome

    雅礼集训期间我好像考完试就开始划水了啊 给出k个长度相同的字符串,每个串有一个权值,选出一些串连成一个回文串.使得选中的串的总权值最大. 如果选一个串,必须同时选一个对称的串.还有一个特殊情况是可以在 ...

  7. cf 478D.Santa Claus and a Palindrome

    原来set,priority_queue也可以映射..涨姿势2333 比较麻烦的应该就是判断自身回文的串是选2个还是选一个吧. #include<bits/stdc++.h> #defin ...

  8. CodeForces 509C Sums of Digits(贪心乱搞)题解

    题意:a是严格递增数列,bi是ai每一位的和,告诉你b1~bn,问你怎样搞才能让an最小 思路:让ai刚好大于ai-1弄出来的an最小.所以直接模拟贪心,如果当前位和前一个数的当前位一样并且后面还能生 ...

  9. [luoguP1053] 篝火晚会(贪心 + 乱搞)

    传送门 假设第一个位置是1,那么枚举它的左右两边是谁,有两种情况,然后可以递推求出序列. 然后可以贪心,两个序列有多少个不同的数,答案就是多少,具体为啥,yy一下即可 然后就是判断递推求出的序列和目标 ...

随机推荐

  1. Docker入门简介

    Docker的概念 什么是Docker? Docker是一个开源平台,包含:容器引擎和Docker Hub注册服务器 Docker容器引擎:可以将开发者打包他们的应用和依赖包到一个可一直的容器中,然后 ...

  2. mac 安装jdk1.5

    前期准备 Java安装包 JDK 1.5:Java for Mac OS X 10.5 Update 10(From: Apple) 辅助工具 Pacifist:用于提取*.dmg安装包中的文件(点我 ...

  3. C语言堆和栈

    堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...

  4. FTF登入tiny210开发板

    配置环境一: 第一步:安装虚拟机             1)安装虚拟机+Linux12.04             2)安装FTP软件 第二步:配置超级终端(串口)             1)开 ...

  5. 4. 什么是AJAX

    术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验.在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的“思考时间”同步.Ajax提供与服务器 ...

  6. 将HTML5封装成android应用APK文件的几种方法(转载)

    越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...

  7. 夺命雷公狗-----React---25--小案例之react经典案例todos(单选框的修改)

    还是老样子,首先给li里面的单选框一个函数,然后通过props来对她进行处理 然后在ul里面对父组建进行传送 补充一下啊第一步,因为到时候要用到index属性,所以我们需要发送多一个index过来 然 ...

  8. 10分钟学习pandas

    10 Minutes to pandas This is a short introduction to pandas, geared mainly for new users. You can se ...

  9. vs2010问题:未能安装xxx包

    打开vs2010新建c++工程,出现问题如图 原因是重复安装了,之前安装的没有删除干净,导致冲突. 如果你的vs2010安装在c盘,解决方法:http://blog.sina.com.cn/s/blo ...

  10. Material Design Lite,简洁惊艳的前端工具箱 之 交互组件。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, 博客地址为http://www.cnblogs.com/jasonnode/ . 网站上有对应 ...