zoukankan      html  css  js  c++  java
  • [CF] Sasha and One More Name

    题目大意

    就是给一个回文串,然后进行k次分割,产生k+1个字符子串,通过重新组合这k+1个字符字串,是否会出现新的不同的回文串,且最少需要分割几段。无法产生新的回文串则输出"Impossible"

    解法

    一个回文串无法分割形成新回文串的的情况就是:

    • 如果字符串长度是偶数,则整串字符串由同一种字符组成。
    • 如果字符串长度是奇数,则除了对称轴上的字符以外的字符串由同种字符组成。

    除了以上的情况,都是可以产生新的回文串的,而且最多只需要分割2次。因为取该字符串任意一个非回文前缀,与该字符串相同长度的后缀进行交换就可以得到一个新的回文串。所以是否只需要分割1次的情况就需要遍历一次该字符串的前半段。

    代码

     1 #include<iostream>
     2 #include<cstring>
     3 #include<string>
     4 using namespace std;
     5 
     6 bool palindrome(string s) {
     7     for (unsigned int i = 0; i < s.size() / 2; i++) {
     8         if (s[i] != s[s.size() - i - 1]) return false;
     9     }
    10     return true;
    11 }
    12 
    13 bool check(string s) {
    14     for (unsigned int i = 0; i < s.size() / 2; i++) {
    15         if (s[i] != s[0]) return true;
    16     }
    17     return false;
    18 }
    19 
    20 bool is_one(string s) {
    21     string t = s;
    22     for (unsigned int i = 0; i < s.size() / 2; i++) {
    23         t = t.substr(1) + s[i];
    24         if (t != s && palindrome(t)) return true;
    25     }
    26     return false;
    27 }
    28 
    29 int main() {
    30     ios::sync_with_stdio(false);
    31     cin.tie(0);
    32     string s;
    33     cin >> s;
    34     if (!check(s)) cout << "Impossible" << endl;
    35     else {
    36         if (is_one(s)) cout << 1 << endl;
    37         else cout << 2 << endl;
    38     }
    39     //system("pause");
    40     return 0;
    41 }
  • 相关阅读:
    动态规划-数位dp-600. 不含连续1的非负整数
    动态规划-数位dp-1012. 至少有 1 位重复的数字
    动态规划-数位dp-902. 最大为 N 的数字组合
    优先队列-1439. 有序矩阵中的第 k 个最小数组和
    再见
    [JSOI2008]星球大战——并查集+逆向思维
    洛谷p1330 封锁阳光大学(二分图染色)
    快速幂
    最小生成树——联络员 Kruskal
    最小生成树——繁忙的都市
  • 原文地址:https://www.cnblogs.com/pullself/p/10501811.html
Copyright © 2011-2022 走看看