题目链接:http://codeforces.com/problemset/problem/883/H

题目大意:给一段长度为n的字符串s,想让你把s切成几段长度相同的回文串,可以改变s中字符的排列,最少可以出现切成几段。

解题思路:看了大佬写的,自己思维还是有诸多不足,也学到了vector可以用pop_back()删除最后一个元素,还学到了处理字符数量的技巧。首先,每段回文串里肯定都有一个字符是单个的,假设每段回文串都没有字符是单个的,那说明可以合成一串,假设不成立。假设有的回文串中有字符是单个的,有的没有,那长度肯定是一奇一偶不符合题目每段长度都相同的要求,假设不成立。

     用vector<char>shuang,vector<char>dan分别统计出现两次和出现一次的字符。

     所以可以分为以下几步:

     ①计算每个字符出现次数,并判奇偶,如果是偶数个就拆分成多个数量为2的字符存入(比如‘c’出现4次,那就存入两次c)shuang。如果是奇数个,就先拿一个存入dan,再把剩下的拆分成多个数量为2的字符存入shuang。

     ②如果没有出现数量为奇数的字符,那就最少可以只有一个回文串,直接将s输出。

     ③出现数量为奇数的字符,如果shuang内的字符不能平分给dan内的字符,也就是不能形成长度相同的回文串,那就把双里的字符拆成两次放入dan中,使得shuang能被dan平分。然后直接输出所有回文串即可。

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<string>
  4. #include<cstdio>
  5. #include<vector>
  6. using namespace std;
  7. const int N=4e5+;
  8.  
  9. int cnt[];
  10. char ans[N],s[N];
  11. vector<char>dan;
  12. vector<char>shuang;
  13.  
  14. int main(){
  15. int n;
  16. scanf("%d",&n);
  17. scanf("%s",s);
  18. for(int i=;i<n;i++){
  19. cnt[s[i]]++;
  20. }
  21. for(int i=;i<=;i++){
  22. if(cnt[i]){
  23. if(cnt[i]%){
  24. cnt[i]--;
  25. dan.push_back(i);
  26. }
  27. while(cnt[i]){
  28. cnt[i]-=;
  29. shuang.push_back(i);
  30. }
  31. }
  32. }
  33. if(dan.size()==){
  34. for(int i=;i<n/;i++){
  35. ans[i]=ans[n-i-]=shuang.back();
  36. shuang.pop_back();
  37. }
  38. ans[n]='\0';
  39. printf("1\n%s\n",ans);
  40. }
  41. else{
  42. //用偶数单词凑成每段长度相同
  43. while(shuang.size()%dan.size()){
  44. dan.push_back(shuang.back());
  45. dan.push_back(shuang.back());
  46. shuang.pop_back();
  47. }
  48. int len=n/dan.size();
  49. printf("%d\n",dan.size());
  50. for(int i=;i<dan.size();i++){
  51. ans[len/]=dan[i];
  52. for(int j=;j<len/;j++){
  53. ans[j]=ans[len-j-]=shuang.back();
  54. shuang.pop_back();
  55. }
  56. ans[len]='\0';
  57. printf("%s ",ans);
  58. }
  59. }
  60. return ;
  61. }

883H - Palindromic Cut(思维+STL)的更多相关文章

  1. codeforces 883H - Palindromic Cut - [字符串处理]

    题目链接:http://codeforces.com/problemset/problem/883/H Time limit: 3000 ms Memory limit: 262144 kB Koly ...

  2. CF1072A Palindromic Twist 思维

    Palindromic Twist time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  3. UVA1471-Defense Lines(思维+STL)

    Problem UVA1471-Defense Lines Accept: 297  Submit: 2776Time Limit: 9000 mSec Problem Description Aft ...

  4. CodeForces - 988D(思维STL)

    原文地址:https://blog.csdn.net/weixin_39453270/article/details/80548442 博主已经讲的很好了 题意: 从一个序列中,选出一个集合,使得集合 ...

  5. CSL 的字符串(思维+STL操作)

    链接:https://ac.nowcoder.com/acm/contest/551/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言1048 ...

  6. 旋转子段 (思维stl)

    题目: 大概意思就是给你一个序列,你可以选择一段区间使它左右翻折一遍,然后呢,从1到n找一遍,看a[i]==i的数最多是多少. 其实刚才我已经把暴力思路说出来了,枚举每一个区间长度,枚举每一个左端点, ...

  7. Educational Codeforces Round 89 (Rated for Div. 2) C. Palindromic Paths (思维)

    题意:有一个\(n\)x\(m\)的矩阵,从\((1,1)\)出发走到\((n,m)\),问最少修改多少个数,使得所有路径上的数对应相等(e.g:\((1,2)\)和\((n-1,m)\)或\((2, ...

  8. STL——迭代器的概念

    迭代器是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物. 1 迭代器设计思维——STL关键所在 不论是泛型思维或STL的实际运用,迭代器都扮演这重要的角色.STL的中心思想在于:将数 ...

  9. STL迭代器------Traits编程技法详细理解(一)

    最近在看STL源码解析的迭代器(iterators)一章,涉及到c++ Traits的编程技法,刚开始看时一头雾水,反复看了好几遍之后才理解这个东西,因此来写写在这方面的理解,如有错误,希望读者指正. ...

随机推荐

  1. SPOJ1825/FTOUR2:Free tour II——包看得懂/看不懂题解

    http://www.spoj.com/problems/FTOUR2/en/ 题目大意:给一棵黑白染色的树,求边权和最大且经过黑点不超过K的路径. ———————————————————— 前排膜拜 ...

  2. HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包)

    HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包) 题意分析 与普通的完全背包大同小异,区别就在于多了一个个数限制,那么在普通的完全背包的基础上,增加一维,表示个数.同时for循环 ...

  3. 51nod 1197 字符串的数量 V2(矩阵快速幂+数论?)

    接上一篇,那个递推式显然可以用矩阵快速幂优化...自己随便YY了下就出来了,学了一下怎么用LaTeX画公式,LaTeX真是个好东西!嘿嘿嘿 如上图.(刚画错了一发...已更新 然后就可以过V2了 or ...

  4. bzoj 2086 [Poi2010]Blocks 单调栈

    [Poi2010]Blocks Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 788  Solved: 356[Submit][Status][Dis ...

  5. ACM1004 Let the balloons fly

    These code is for the problem "Let the balloons Fly" in ACM 1004 which need deal with stri ...

  6. 利用枚举算法实现todoList:把对应项添加的内容列表

    功能: 点击城市列表项,如果内容列表不存在,则插入点击项: 如果内容列表中已存在,则不插入,然后把内容列表中的对应项放到第一位. HTML代码: <!DOCTYPE html> <h ...

  7. 图论:Prufer编码

    BZOJ1211:使用prufer编码解决限定结点度数的树的计数问题 首先学习一下prufer编码是干什么用的 prufer编码可以与无根树形成一一对应的关系 一种无根树就对应了一种prufer编码 ...

  8. 奇偶排序Odd-even sort

    又一个比较性质的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组[6 2 4 1 5 9] 第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比 ...

  9. ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer

    21:09:22.221 [MessageBroker-3] INFO c.t.s.s.impl.StockNewsServiceImpl - [2017-12-16 21:09:22] execut ...

  10. Plant (矩阵快速幂)

    题目链接:http://codeforces.com/problemset/problem/185/A 题目: Dwarfs have planted a very interesting plant ...