题目大意
就是给一个回文串,然后进行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 }