题意:给定k个长度为n的字符串,每个字符串有一个魅力值ai,在k个字符串中选取字符串组成回文串,使得组成的回文串魅力值最大。

分析:

1、若某字符串不是回文串a,但有与之对称的串b,将串a和串b所有的魅力值分别从大到小排序后,若两者之和大于0,则可以放在回文串的两边。

2、若某字符串是回文串,将其魅力值从大到小排序后,两两依次分析:(mid---可能放在回文串中间的串的最大魅力值)

(1)若两个数都是正的,那么就将其放在两边,并将结果计入ans。(ans---回文串两边的串的魅力值之和)

(2)若一正一负,且正数绝对值大,可以放在两边,也可以将正数放在中间同时舍去负数。

那么先假定这两个数是放在两边的,并将结果计入ans。

若该正数放在回文串的中间最终是mid的最大值,那么实际上结果增加了是负数的绝对值,所以将负数的绝对值与mid比较,并更新。

eg:

(i)aaa:5,-3;bbb:4;

aaa放在中间相对于放在两边最终的结果是增加了3,而bbb放在中间最终的结果是增加了4,所以aaa应当放在两边,而且中间的串应取bbb。

(ii)aaa:5,-3;bbb:2;

aaa放在中间相对于放在两边最终的结果是增加了3,而bbb放在中间最终的结果是增加了2,所以aaa放在中间是最好的情况,mid应取3。

(3)若一正一负,且负数绝对值大,那么一定不能放在两边(因为两者之和小于0),但正数可以放在中间,更新mid。

(4)若两数都是负的,那么不放进回文串。

  1. #pragma comment(linker, "/STACK:102400000, 102400000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cctype>
  6. #include<cmath>
  7. #include<iostream>
  8. #include<sstream>
  9. #include<iterator>
  10. #include<algorithm>
  11. #include<string>
  12. #include<vector>
  13. #include<set>
  14. #include<map>
  15. #include<stack>
  16. #include<deque>
  17. #include<queue>
  18. #include<list>
  19. #define Min(a, b) ((a < b) ? a : b)
  20. #define Max(a, b) ((a < b) ? b : a)
  21. const double eps = 1e-8;
  22. inline int dcmp(double a, double b){
  23. if(fabs(a - b) < eps) return 0;
  24. return a > b ? 1 : -1;
  25. }
  26. typedef long long LL;
  27. typedef unsigned long long ULL;
  28. const int INT_INF = 0x3f3f3f3f;
  29. const int INT_M_INF = 0x7f7f7f7f;
  30. const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
  31. const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
  32. const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
  33. const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
  34. const int MOD = 1e9 + 7;
  35. const double pi = acos(-1.0);
  36. const int MAXN = 100000 + 10;
  37. const int MAXT = 1000000 + 10;
  38. using namespace std;
  39. map<string, int> mp;
  40. vector<int> v[MAXN];
  41. vector<string> t;
  42. int k, n;
  43. string s;
  44. int cnt;
  45. int vis[MAXN];
  46. void init(){
  47. cnt = 0;
  48. for(int i = 0; i < MAXN; ++i) v[i].clear();
  49. mp.clear();
  50. memset(vis, 0, sizeof vis);
  51. t.clear();
  52. }
  53. int get_id(string x){
  54. if(mp.count(x)) return mp[x];
  55. return mp[x] = ++cnt;
  56. }
  57. bool judge(string x){
  58. for(int i = 0; i < n / 2; ++i)
  59. if(x[i] != x[n - i - 1]) return false;
  60. return true;
  61. }
  62. int main(){
  63. while(scanf("%d%d", &k, &n) == 2){
  64. init();
  65. for(int i = 0; i < k; ++i){
  66. cin >> s;
  67. int id = get_id(s);
  68. int value;
  69. scanf("%d", &value);
  70. v[id].push_back(value);
  71. if(judge(s)) vis[id] = -1;//回文串
  72. else{
  73. t.push_back(s);//非回文串
  74. }
  75. }
  76. int l = t.size();
  77. for(int i = 0; i < l; ++i){
  78. string tt = t[i];
  79. reverse(t[i].begin(), t[i].end());
  80. if(mp.count(t[i])){
  81. vis[mp[tt]] = mp[t[i]];
  82. }
  83. }
  84. int ans = 0;
  85. int mid = 0;
  86. for(int i = 1; i <= cnt; ++i){
  87. if(!vis[i]) continue;
  88. if(vis[i] != -1){//非回文串且有对称串
  89. vis[vis[i]] = 0;
  90. int tmp_id = vis[i];
  91. int len = Min(v[i].size(), v[tmp_id].size());
  92. sort(v[i].begin(), v[i].end(), greater<int>());
  93. sort(v[tmp_id].begin(), v[tmp_id].end(), greater<int>());
  94. for(int j = 0; j < len; ++j){
  95. if(v[i][j] + v[tmp_id][j] > 0) ans += v[i][j] + v[tmp_id][j];
  96. else break;
  97. }
  98. }
  99. else{
  100. int len = v[i].size();
  101. if(len == 1){
  102. mid = Max(mid, v[i][0]);
  103. continue;
  104. }
  105. sort(v[i].begin(), v[i].end(), greater<int>());
  106. for(int j = 0; j < len; j += 2){
  107. if(j + 1 < len){
  108. if(v[i][j] + v[i][j + 1] > 0){
  109. ans += v[i][j] + v[i][j + 1];
  110. if(v[i][j] >= 0 && v[i][j + 1] < 0){
  111. mid = Max(mid, -v[i][j + 1]);
  112. }
  113. else if(v[i][j] < 0 && v[i][j + 1] >= 0){
  114. mid = Max(mid, -v[i][j]);
  115. }
  116. }
  117. else{
  118. if(v[i][j] >= 0){
  119. mid = Max(mid, v[i][j]);
  120. }
  121. else if(v[i][j + 1] >= 0){
  122. mid = Max(mid, v[i][j + 1]);
  123. }
  124. else break;
  125. }
  126. }
  127. else{
  128. if(v[i][j] > 0) mid = Max(mid, v[i][j]);
  129. }
  130. }
  131. }
  132. }
  133. printf("%d\n", ans + mid);
  134. }
  135. return 0;
  136. }

  

CodeForces - 748D Santa Claus and a Palindrome (贪心+构造)的更多相关文章

  1. Codeforces 748D Santa Claus and a Palindrome

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

  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. Santa Claus and a Palindrome

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

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

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

  5. 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 ...

  6. Codeforces 752C - Santa Claus and Robot - [简单思维题]

    题目链接:http://codeforces.com/problemset/problem/752/C time limit per test 2 seconds memory limit per t ...

  7. codeforces 748E Santa Claus and Tangerines

    E. Santa Claus and Tangerines time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  8. Codeforces 784B Santa Claus and Keyboard Check

    题面: 传送门 B. Santa Claus and Keyboard Check Input file: standard input Output file: standard output Time ...

  9. [CF752D]Santa Claus and a Palindrome(优先队列,贪心乱搞)

    题目链接:http://codeforces.com/contest/752/problem/D 题意:给长度为k的n个字符串,每一个字符串有权值,求构造一个大回文串.使得权值最大. 因为字符串长度都 ...

随机推荐

  1. flutter如何使用配置文件pubspec.yaml(位于项目根目录)来管理第三方依赖包

    官方文档 在软件开发中,很多时候有一些公共的库或SDK可能会被很多项目用到,因此,将这些代码单独抽到一个独立模块,然后哪个项目需要使用时再直接集成这个模块,便可大大提高开发效率.很多编程语言或开发工具 ...

  2. 管理和安装 chart【转】

    安装 chart 当我们觉得准备就绪,就可以安装 chart,Helm 支持四种安装方法: 安装仓库中的 chart,例如:helm install stable/nginx 通过 tar 包安装,例 ...

  3. 数十万PhpStudy用户被植入后门,快来检测你是否已沦为“肉鸡”!

    北京时间9月20日,杭州公安发布<杭州警方通报打击涉网违法犯罪暨‘净网2019’专项行动战果>一文,文章曝光了国内知名PHP调试环境程序集成包“PhpStudy软件”遭到黑客篡改并植入“后 ...

  4. SpringBoot#ConfigurationProperties注解相关的一些知识

    用途:ConfigurationProperties注解,用于在spring环境定义bean的时候.通过这个注解,把配置文件中的相关属性注入到实例化的bean中. 原理:spring中bean的生命周 ...

  5. html基础与入门

    html就是指一个html文件,它是由各种标签组成的 html分为 < !DOCTYPE html > 和 Head 和 Body Head title+meta+link+style B ...

  6. 013.CI4框架CodeIgniter数据库操作之:查询数据库,并让数据以数组的方式返回查询结果

    01. 我们在CI4框架中的Model文件夹新建一个User_model.php的文件,使用的是getResultArray,表示并让数据以数组的方式返回查询结果,代码如下: <?php nam ...

  7. C++远征--jame_yuan(慕课网)

    int &a=b;引用符 int const a = 3; int *p = &a;     只读 不能 赋给 读写 有默认参数值得参数必须在参数表的最右端 void fun(int ...

  8. P1004 成绩排名

    转跳点:

  9. 微信小程序实现左滑删除效果(原生/uni-app)

    实现效果 列表中侧滑删除 删除不同时存在 scrollview上下滑动与侧滑删除不影响 uni-app实现 html部分 <template> <scroll-view :scrol ...

  10. bzoj 1369: [Baltic2003]Gem

    确实是神2333333333,一开始以为是01染色sb题,然而被打脸... (蒟蒻不乱说,网上各种神犇的题解,还有图!!) #include <bits/stdc++.h> #define ...