【題目】ios
【描述】spa
IA有一個由若干個'a'和'b'組成的字符串,IA能夠翻轉該字符串的任意長的前綴,IA想經過這樣的操做獲得一個字典序最小的字符串,求一種可能的翻轉方案。輸出是否翻轉長度爲k的前綴,k=1,2,...,n,n爲該字符串長度。code
數據範圍:1<=字符串長度<=1000blog
【思路】字符串
爲了把第m+1個字符挪到第1個位置並保持其餘字符不動,能夠翻轉m長的和m+1長的前綴(前後順序不影響結果)。因而,咱們能夠經過這樣的操做把每個'a'挪到最前面,最後就獲得了前面全是'a'後面全是'b'的字符串,這固然是能獲得的字典序最小的字符串。get
咱們又發現,對於m長的前綴,若是翻轉兩次,至關於沒有翻轉,進一步,若是翻轉偶數次至關於沒有翻轉,若是翻轉奇數次就至關於翻轉了一次。string
對字符串從前日後掃描,遇到'a'作一次上述操做(若第一個字符是'a'則不用動),就能夠獲得答案。it
【個人實現】io
複雜度:O(Lenth)
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 6 using namespace std; 7 #define MaxN 1020 8 9 char s[MaxN]; 10 int a[MaxN]; 11 12 int main() 13 { 14 int Len; 15 int i; 16 scanf("%s", s); 17 Len = strlen(s); 18 //cout << Len <<endl; 19 memset(a, 0, sizeof(a)); 20 for(i = 0; i < Len; i++) 21 { 22 if(i > 0 && s[i] == 'a') 23 { 24 a[i-1]++; 25 a[i]++; 26 } 27 } 28 for(i = 0; i < Len; i++) 29 printf("%d ", a[i] % 2); 30 return 0; 31 }
【評測結果】