C. Smallest Word
题解:自己随便列几组数据模拟一下就会发现,无论如何最后总能翻成类似 a a a a b b b b b aaaabbbbb aaaabbbbb这样,即 a a a全在前面, b b b在后面。数据量又小因此可以暴力模拟。还有解法就是只要遇到当前字符与下一个不同,就翻转一次。
代码
模拟
#include<bits/stdc++.h>
int bit[1010],flip[1010];
void F(int d)
{
for(int i = 1, j = d; i <= d/2; ++i,--j){
int t = bit[i];
bit[i] = bit[j];
bit[j] = t;
}
}
using namespace std;
int main()
{
#ifndef ONLINE_JUDGE
// freopen("input.in","r",stdin);
#endif
string s;
cin>>s; // bbaababab
// bbab abaa aaba bbabab abbbab ababba
int len = s.length();
for(int i = 1; i <= len; ++i) {
if(s[i-1] == 'a') bit[i] = 1;
else bit[i] = 0;
}
for(int i = 1; i <= len; ++i){
if(bit[1] == 1) {
int d;
for(d = 2; d <= len; ++d){
if(bit[d] == 0) break;
}
for(int j = d; j <= len; ++j){
if(bit[j] == 1) {
flip[j-1] = 1;
F(j-1);
break;
}
}
}else{
int d;
for(d = 2; d <= len; ++d){
if(bit[d] == 1) break;
}
for(int j = d; j <= len; ++j){
if(bit[j] == 0) {
flip[j-1] = 1;
F(j-1);
break;
}
}
}
}
/* for(int i = 1; i <= len; ++i){
char ch = bit[i]?'a':'b';
printf("%c",ch);
}*/
if(bit[len] == 1) flip[len] = 1;
// aaabbba
// bbaabbabab aabbbbabab bbbaabab aabbbbab bbbbaaab aaabbbbb
for(int i = 1; i <= len; ++i){
printf("%d%c",flip[i],i==len?'\n':' ');
}
return 0;
}
第二种
#include<bits/stdc++.h>
using namespace std;
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
string s;
cin>>s;
bool flip[1010] = {0};
for(int i = 0; i < s.length() - 1; ++i){
if(s[i] != s[i + 1]) {
// cout<<i<<' '<<s[i]<<endl;
flip[i] = 1;
}
}
if(s[s.length()-1] == 'a') flip[s.length() - 1] = 1;
for(int i = 0; i < s.length(); ++i){
printf("%d%c",flip[i],i==s.length()-1?'\n':' ');
}
return 0;
}