思路一直是正确的,总是wa
一开始我估计复杂度是n^2 后来提前把和求出来,就变成n了
就可以直接暴力了
后来在hdu discuss发现,原来是数据有问题
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int t,cnt=0;
scanf("%d",&t);
while(t--){
cnt++;
string s;
cin>>s;
long long a[100005];
memset(a,0,sizeof(a));
char temp=s[0];
int num=0;
for(int i=0;i<s.size();i++)
{
if(s[i]==temp) a[num]++;
if(s[i]!=temp) {
num++;
temp=s[i];
a[num]++;
}
}
// for(int i=0;i<=num;i++)
// printf("%d ",a[i]);
// printf("\n");
if(num==0){
long long temp=a[0]*a[0];
printf("Case #%d: %I64d\n",cnt,temp); continue;
}
if(num==1){
long long temp=(max(a[0],a[1])+1)*(max(a[0],a[1])+1)+(min(a[0],a[1])-1)*(min(a[0],a[1])-1);
printf("Case #%d: %I64d\n",cnt,temp); continue;
}
long long sum=0;
for(int i=0;i<=num;i++){
sum+=(a[i]*a[i]);
}
long long ans=0;
for(int i=0;i<num;i++){
long long res=sum;
res-=(a[i]*a[i]+a[i+1]*a[i+1]);
res+=(max(a[i],a[i+1])+1)*(max(a[i],a[i+1])+1)+(min(a[i],a[i+1])-1)*(min(a[i],a[i+1])-1);
ans=max(ans,res);
if(a[i+1]==1&&i+2<=num){
res=sum;
res-=(a[i]*a[i]+a[i+1]*a[i+1]+a[i+2]*a[i+2]);
res+=((a[i]+a[i+2]+1)*(a[i]+a[i+2]+1));
ans=max(ans,res);
}
}
printf("Case #%d: %I64d\n",cnt,ans);
}
}