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 }
  • 相关阅读:
    redis主从之过期key判断
    PHP之回调、匿名函数
    调试printf,fprintf (转)
    第一天,来报道
    hdu 4464 browsing history
    腾讯编程马拉松2012第一题
    今天面试悲剧了,看来面试前看考题是很关键的.
    JQuery访问WebService(可访问Java[Xfire])
    自己留备份,不解释.
    MYSQL UNION AND UNION ALL 的区别!
  • 原文地址:https://www.cnblogs.com/pullself/p/10501811.html
Copyright © 2011-2022 走看看