[题解]Codeforces Round #519 - C. Smallest Word

【题目】ios

C. Smallest Wordide

【描述】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 }
View Code

【评测结果】

相关文章
相关标签/搜索