调了半天还是 WA on test#2
#include <bits/stdc++.h>
using namespace std;
namespace Main
{
typedef long long ll;
int t;
const int maxn=2e5+5;
char s[maxn];
int n;
int zerosum;
int f[maxn],f2[maxn];
inline int subtask1()
{
for(int i=0;i<=n+1;i++)
{
f[i]=f2[i]=0;
}
zerosum=0;
int fir_min=0x3f3f3f3f,fir=0;
int las_min=0x3f3f3f3f,las=n+1;
for(int i=1;i<=n;i++)
{
if(s[i]=='0')
{
zerosum++;
}
}
int del_1=0,ls=zerosum;
int tmp_ls,tmp_del1;
f[0]=zerosum;
fir_min=f[0];
tmp_ls=zerosum;
tmp_del1=0;
for(int i=1;i<=n;i++)
{
if(s[i]=='0')
{
ls--;
}
if(s[i]=='1')
{
del_1++;
}
f[i]=max(ls,del_1);
if(f[i]<fir_min)
{
tmp_ls=ls;
tmp_del1=del_1;
}
fir_min=min(fir_min,f[i]);
}
for(int i=0;i<=n;i++)
{
if(f[i]==fir_min)
{
fir=i;
break;
}
}
ls=tmp_ls;
del_1=tmp_del1;
las_min=min(las_min,max(ls,del_1));
for(int i=n;i>fir;i--)
{
if(s[i]=='0')
{
ls--;
}
if(s[i]=='1')
{
del_1++;
}
f2[i]=max(ls,del_1);
las_min=min(las_min,f2[i]);
}
return las_min;
}
inline int subtask2()
{
for(int i=0;i<=n+1;i++)
{
f[i]=f2[i]=0;
}
zerosum=0;
int fir_min=0x3f3f3f3f,fir=0;
int las_min=0x3f3f3f3f,las=n+1;
for(int i=1;i<=n;i++)
{
if(s[i]=='0')
{
zerosum++;
}
}
int del_1=0,ls=zerosum;
int tmp_ls,tmp_del1;
f2[n+1]=zerosum;
las_min=f2[n+1];
tmp_ls=zerosum;
tmp_del1=0;
for(int i=n;i>=1;i--)
{
if(s[i]=='0')
{
ls--;
}
if(s[i]=='1')
{
del_1++;
}
f2[i]=max(ls,del_1);
if(f2[i]<las_min)
{
tmp_ls=ls;
tmp_del1=del_1;
}
las_min=min(las_min,f2[i]);
}
for(int i=n+1;i>=1;i--)
{
if(f2[i]==las_min)
{
las=i;
break;
}
}
ls=tmp_ls;
del_1=tmp_del1;
fir_min=min(fir_min,max(ls,del_1));
for(int i=1;i<las;i++)
{
if(s[i]=='0')
{
ls--;
}
if(s[i]=='1')
{
del_1++;
}
f[i]=max(ls,del_1);
fir_min=min(fir_min,f[i]);
}
return fir_min;
}
void main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s",s+1);
n=strlen(s+1);
for(int i=0;i<=n+1;i++)
{
f[i]=f2[i]=0;
}
int a=subtask1();
int b=subtask2();
printf("%d\n",min(a,b));
}
}
}
int main()
{
Main::main();
return 0;
}