[CF] Sasha and One More Name

[CF] Sasha and One More Name_第1张图片

题目大意

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

解法

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

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

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

代码

 

 1 #include
 2 #include
 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 }

 

你可能感兴趣的:([CF] Sasha and One More Name)