HDU5583 上海赛铜牌题
生活随笔
收集整理的這篇文章主要介紹了
HDU5583 上海赛铜牌题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這道題的意思是給你一個01串, 定義這串的優美值為連續相同的數字的平方和, 現在可以改變這些串中一個字符, 問你優美值最大是多少? 我們可以預處理出d1[i]i左邊和str[i]相同的字符個數, d2[i]i右邊和str[i]相同的字符個數, 對于一個i, 我們可以進行如下分類, i周圍的兩個元素和i都不相同, 有一個相同, 兩個都相同, 按照這個規律掃一遍即可得出答案, 代碼如下:
#include <bits/stdc++.h>using namespace std; typedef long long LL; char str[100000 + 100]; int d1[100000+100], d2[100000 + 100];LL n2(LL a) {return a*a; }int main() {int T;scanf("%d", &T);int kase = 0;while(T--){scanf("%s", str+1);int len = strlen(str+1);memset(d1, 0, sizeof(d1));memset(d2, 0, sizeof(d2));LL res = 0;for(int i=1; i<=len; i++){if(i>1 && str[i]!=str[i-1]){res += (LL)d1[i-1]*(LL)d1[i-1];d1[i] = 1;}else d1[i] = d1[i-1]+1;}res += (LL)d1[len]*(LL)d1[len];for(int i=len; i>=1; i--){if(i<len && str[i]!=str[i+1])d2[i] = 1;else d2[i] = d2[i+1] + 1;}LL ans;LL ansres = res;str[0]='3', str[len+1]='3';for(int i=1; i<=len; i++){if(str[i]==str[i+1] && str[i]==str[i-1]){ans = res-n2(d1[i]+d2[i]-1)+n2(d1[i]-1)+n2(d2[i]-1)+1;ansres = max(ansres, ans);}if(str[i]==str[i+1] && str[i]!=str[i-1]){ans = res-n2(d2[i])-n2(d1[i-1])+n2(d1[i-1]+1)+n2(d2[i]-1);ansres = max(ansres, ans);}if(str[i]!=str[i+1] && str[i]==str[i-1]){ans = res-n2(d1[i])-n2(d2[i+1])+n2(d1[i]-1)+n2(d2[i+1]+1);ansres = max(ansres, ans);}if(str[i]!=str[i-1] && str[i]!=str[i+1]){ans = res-n2(d1[i-1])-n2(d2[i+1])-1+n2(d1[i-1]+d2[i+1]+1);ansres = max(ansres, ans);}}printf("Case #%d: %lld\n", ++kase, ansres);}return 0; }
?
轉載于:https://www.cnblogs.com/xingxing1024/p/5264741.html
總結
以上是生活随笔為你收集整理的HDU5583 上海赛铜牌题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个性签名王俊凯
- 下一篇: 第一张天气图是谁画的呢?