题意:
如果一个字符串不包含 "010 "或 "101 "的子序列,则称为好字符串–例如,"1001 "包含 "101 "的子序列,因此它不是一个好字符串,而 "1000 "既不包含 "010 "也不包含 "101 "的子序列,所以它是一个好字符串。
那么,他最少要进行多少次操作才能使该字符串成为好字符串?可以证明,通过这些操作,我们可以使任何字符串变得良好。
思路:
010和101作为子串的情况都不能出现,那么母串出现0紧接着1的时候之后就不能出现0了,所以母串可能是00111or1110or1101,当然第三种情况会被视为101,所以也不能出现,所以答案串有几种情况:①:0000000,②000111,③111111,④111000,计算答案的时候可以把0开头和1开头分两种情况~计算答案的时候还有小细节我的处理是:
利用前缀和对于前面两种情况枚举边界的位置,答案数就是之后的0+之前的1和之前的1+之后的0取min~
#include<bits/stdc++.h> using namespace std; char s1[1005]; int sum0[1005],sum1[1005]; int main() { int n,i,j,t; cin>>t; while(t--) { cin>>(s1+1);s1[0]='x'; sum0[0]=0,sum1[0]=0; for(i=1;i<strlen(s1);i++) //0开头的情况 { if(s1[i]=='0') sum0[i]=sum0[i-1]+1,sum1[i]=sum1[i-1]; else sum1[i]=sum1[i-1]+1,sum0[i]=sum0[i-1]; } int d1=strlen(s1)-1; int ans=0x3f3f3f3f; for(i=1;i<strlen(s1);i++) { ans=min({ans,((sum0[d1]-sum0[i])+(sum1[i-1])),(sum0[i-1]+sum1[d1]-sum1[i])}); } ans=min({ans,d1-sum0[i-1],d1-sum1[i-1]}); cout<<ans<<endl; } return 0; }