[題解]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

【評測結果】

相關文章
相關標籤/搜索