【题目】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 }
【评测结果】