1. 程式人生 > >[CF] Sasha and One More Name

[CF] Sasha and One More Name

輸出 pos als 組合 情況 names pau sin clas

技術分享圖片

題目大意

就是給一個回文串,然後進行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 }

[CF] Sasha and One More Name