hdu5583

时间:2023-03-09 17:18:41
hdu5583
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> char str[];
///注意在ans+=f[g]*f[g];中,ans是long long,所以运算的两个数至少有一个数是long long,所以f数组选择的类型是长整形
long long f[]; int main()
{
long n,g,pre,len,i,j;
long long ans,t,s;
scanf("%ld",&n);
for (j=;j<=n;j++)
{
g=;
pre=-;
ans=;
scanf("%s",str);
len=strlen(str);
for (i=;i<len;i++)
if (str[i]!=str[i+])
{
g++;
f[g]=i-pre;
ans+=f[g]*f[g];
pre=i;
}
if (g==)
printf("Case #%ld: %lld\n",j,ans);
else
{
t=;
for (i=;i<g;i++)
{
//(f[x]+1)*(f[x]+1)+(f[y]-1)*(f[y]-1)-f[x]*f[x]-f[y]*f[y]=2*f[x]-2*f[y]+2
s=abs(f[i]-f[i+]);
if (s>t)
t=s;
}
t=t*+;
for (i=;i<g;i++)
if (f[i]==)
{
s=(f[i-]++f[i+])*(f[i-]++f[i+])-f[i-]*f[i-]--f[i+]*f[i+];
if (s>t)
t=s;
}
printf("Case #%ld: %lld\n",j,ans+t);
}
}
return ;
}