B. Subsequence Hate
题意
给定一个 01 串,可以将 01 串中的 0 变为 1、1 变为 0,问至少需要变换多少次使得 01 串中不含有子序列 010 或 101 。
思路
不含有子序列 010 或 101 的字符串只有两种情况:
- 0000000000000111111
- 1111111111000000000
即:连续的 0 +连续的 1 或者 连续的 1 + 连续的 0
统计将前 i 位都变成 0 或 1 所需要的操作次数,枚举 01 串中 0 的个数和 10 串中 1 的个数,然后记录答案即可。
代码
#include<bits/stdc++.h>
using namespace std;
int t;
string s;
int main(){
cin >> t;
while(t--){
cin >> s;
s = " " + s;
int n = s.size();
//将前i项变成1或0需要的次数
int pre0[1005]={0};
int pre1[1005]={0};
for(int i = 1; i < n; ++i){
pre0[i] = pre0[i-1];
pre1[i] = pre1[i-1];
(s[i]=='1' ? pre0[i] : pre1[i])++;
}
int ans = min(pre0[n-1],pre1[n-1]);//全1或全0
//前i个为0
for(int i = 1; i < n; ++i){
ans = min(ans,pre0[i]+pre1[n-1]-pre1[i]);
}
//前i个为1
for(int i = 1; i < n; ++i){
ans = min(ans,pre1[i]+pre0[n-1]-pre0[i]);
}
cout << ans << endl;
}
return 0;
}