题意:有一个由A,B,C构成的串(下标从1开始)。你可以对于一个连续的ABC进行以下操作:
1.当B的下标为奇时,删除B
2.当B的下标为偶时,删除AC
求最多操作次数。
分析:删B会使得B后面的字符奇偶性变化,删AC只会改变B的奇偶性。
显然只有...AAABCCC...这种才能进行多次操作,且应尽量先删AC。又因为删B可以使得后面的选择更多,所以只剩下ABC时应删B。
代码:
char a[maxn];
pii b[maxn];
void solve()
{
cin>>a+1;
int n=strlen(a+1);
int m=0;
for(int i=1;i<=n;i++)
{
if(a[i]=='B')
{
for(int j=1;j<=n;j++)
{
if(!(a[i-j]=='A'&&a[i+j]=='C'))
{
if(j!=1)
{
b[++m]={i&1,j-1};
}
break;
}
}
}
}
int ans=0,cnt=0;
for(int i=1;i<=m;i++)
{
if(cnt==0)
{
if(b[i].first) cnt++,ans++;
else
{
if(b[i].second==1) ans++;
else cnt++,ans+=2;
}
}
else
{
ans+=min(b[i].second,(b[i].first==0)+cnt+1);
cnt++;
}
}
cout<<ans<<endl;
}