[题解]Codeforces Round #519 - C. Smallest Word
【题目】
【描述】
IA有一个由若干个'a'和'b'组成的字符串,IA可以翻转该字符串的任意长的前缀,IA想通过这样的操作得到一个字典序最小的字符串,求一种可能的翻转方案。输出是否翻转长度为k的前缀,k=1,2,...,n,n为该字符串长度。
数据范围:1<=字符串长度<=1000
【思路】
为了把第m+1个字符挪到第1个位置并保持其他字符不动,可以翻转m长的和m+1长的前缀(先后顺序不影响结果)。于是,我们可以通过这样的操作把每一个'a'挪到最前面,最后就得到了前面全是'a'后面全是'b'的字符串,这当然是能得到的字典序最小的字符串。
我们又发现,对于m长的前缀,如果翻转两次,相当于没有翻转,进一步,如果翻转偶数次相当于没有翻转,如果翻转奇数次就相当于翻转了一次。
对字符串从前往后扫描,遇到'a'做一次上述操作(若第一个字符是'a'则不用动),就可以得到答案。
【我的实现】
复杂度: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 }
【评测结果】