http://acm.hdu.edu.cn/showproblem.php?pid=5583
题意:
给出一个01串,现在对这串进行分组,连续相同的就分为一组,如果该组内有x个数,那么就对答案贡献x*x,现在最多可以修改原串中的一个字符,问答案最大可以为多少。
思路:
暴力求解。
一开始只需要预处理分块,计算出每一分块的个数,然后暴力处理一下即可,需要注意分块数为1的情况,此时左右两边都要合并起来。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 1e5+5; 8 typedef long long ll; 9 10 char s[maxn]; 11 ll a[maxn]; 12 int top; 13 14 int main() 15 { 16 //freopen("in.txt","r",stdin); 17 int T; 18 int kase = 0; 19 scanf("%d",&T); 20 while(T--) 21 { 22 memset(a,0,sizeof(a)); 23 scanf("%s",s); 24 int len = strlen(s); 25 ll cnt = 0; 26 top = 0; 27 ll tmp = 0; 28 for(int i=0;i<len;i++) 29 { 30 if(i==0 || s[i]==s[i-1]) cnt++; 31 else 32 { 33 a[++top]=cnt; 34 tmp+=cnt*cnt; 35 cnt = 1; 36 } 37 if(i==len-1) 38 { 39 a[++top]=cnt; 40 tmp+=cnt*cnt; 41 } 42 } 43 ll ans = 0; 44 for(int i=1;i<=top;i++) 45 { 46 ll tt = tmp; 47 if(i!=1) 48 { 49 tt=tt-a[i]*a[i]-a[i-1]*a[i-1]; 50 if(a[i]==1) 51 { 52 tt-=a[i+1]*a[i+1]; 53 tt+=(a[i-1]+a[i]+a[i+1])*(a[i-1]+a[i]+a[i+1]); 54 } 55 else 56 { 57 tt+=(a[i-1]+1)*(a[i-1]+1)+(a[i]-1)*(a[i]-1); 58 } 59 ans=max(ans,tt); 60 } 61 tt = tmp; 62 if(i!=top) 63 { 64 tt=tt-a[i]*a[i]-a[i+1]*a[i+1]; 65 if(a[i]==1) 66 { 67 tt-=a[i-1]*a[i-1]; 68 tt+=(a[i-1]+a[i]+a[i+1])*(a[i-1]+a[i]+a[i+1]); 69 } 70 else 71 { 72 tt+=(a[i]-1)*(a[i]-1)+(a[i+1]+1)*(a[i+1]+1); 73 } 74 ans=max(ans,tt); 75 } 76 } 77 if(top==1) ans=a[1]*a[1]; 78 printf("Case #%d: ",++kase); 79 cout<<ans<<endl; 80 } 81 return 0; 82 }