[题解]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 }
View Code

【评测结果】

原文地址:https://www.cnblogs.com/CQBZOIer-zyy/p/9873907.html