hdoj 5583 Kingdom of Black and White
2017-10-15 17:10
411 查看
题目链接:Kingdom of Black and White
题目大意:给你一些由0和1组成的字符串,现在你可以变换至多一个字符变成另一个,求最大贡献,贡献的计算方式是连续相同的字符的和的平方之和
题目思路:我们可以把一块当成一个整体来看,我们可以知道的是,在长度不为1的块中,变中间的数字一定不会导致贡献的增加,只有头尾是可以的,然后对于长度为1的块需要特判,我们在判断块的时候枚举每一块的头尾就好了,贡献计算的时候小心一下就好了
题目大意:给你一些由0和1组成的字符串,现在你可以变换至多一个字符变成另一个,求最大贡献,贡献的计算方式是连续相同的字符的和的平方之和
题目思路:我们可以把一块当成一个整体来看,我们可以知道的是,在长度不为1的块中,变中间的数字一定不会导致贡献的增加,只有头尾是可以的,然后对于长度为1的块需要特判,我们在判断块的时候枚举每一块的头尾就好了,贡献计算的时候小心一下就好了
#include <map> #include <set> #include <cmath> #include <stack> #include <queue> #include <cstdio> #include <vector> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const ll maxn = 1e6+10; ll T; char str[maxn]; struct node{ ll head,tail,length; }kuai[maxn]; void init(){ for(ll i = 0;i < maxn;i++) kuai[i].length = kuai[i].head = kuai[i].tail = 0; } int main(){ scanf("%lld",&T); for(ll Case = 1;Case <= T;Case++){ getchar(); memset(str,'\0',sizeof(str)); init(); scanf("%s",str); ll l = strlen(str); ll cot = 1,len = 1; kuai[cot].head = 0; for(ll i = 1;i < l;i++){ if(str[i] != str[i-1]){ kuai[cot].tail = i-1; kuai[cot+1].head = i; kuai[cot].length = len; len = 1; cot++; } else len++; } kuai[cot].tail = l-1;kuai[cot].length = kuai[cot].tail-kuai[cot].head+1; ll sum = 0,maxx = -1; for(ll i = 1;i <= cot;i++){ sum += kuai[i].length*kuai[i].length; } maxx = sum; ll res = sum-kuai[1].length*kuai[1].length+(kuai[1].length-1)*(kuai[1].length-1)-kuai[2].length*kuai[2].length+(kuai[2].length+1)*(kuai[2].length+1); maxx = max(maxx,res); res = sum-kuai[cot].length*kuai[cot].length+(kuai[cot].length-1)*(kuai[cot].length-1)-kuai[cot-1].length*kuai[cot-1].length+(kuai[cot-1].length+1)*(kuai[cot-1].length+1); maxx = max(maxx,res); for(ll i = 2;i <= cot-1;i++){ if(kuai[i].length == 1) { res = sum-1-kuai[i+1].length*kuai[i+1].length-kuai[i-1].length*kuai[i-1].length+(kuai[i-1].length+kuai[i+1].length+1)*(kuai[i-1].length+kuai[i+1].length+1); maxx = max(res,maxx); continue; } res = sum-kuai[i].length*kuai[i].length+(kuai[i].length-1)*(kuai[i].length-1)-kuai[i-1].length*kuai[i-1].length+(kuai[i-1].length+1)*(kuai[i-1].length+1); maxx = max(res,maxx); res = sum-kuai[i].length*kuai[i].length+(kuai[i].length-1)*(kuai[i].length-1)-kuai[i+1].length*kuai[i+1].length+(kuai[i+1].length+1)*(kuai[i+1].length+1); maxx = max(res,maxx); } printf("Case #%lld: %lld\n",Case,maxx); } return 0; }
相关文章推荐
- hdoj Kingdom of Black and White 5583 (模拟&&DP) 好题
- hdoj 5583 Kingdom of Black and White 【模拟】
- hdu 5583 Kingdom of Black and White
- hdu 5583 Kingdom of Black and White
- HDU - 5583 Kingdom of Black and White
- hdu 5583 Kingdom of Black and White【枚举】
- hdu 5583 Kingdom of Black and White 2015ACM/ICPC亚洲区上海站-重现赛
- HDU 5583 Kingdom of Black and White 水题
- hdu 5583 Kingdom of Black and White
- HDU-5583 Kingdom of Black and White(思维)
- hdu 5583 Kingdom of Black and White
- HDU 5583 Kingdom of Black and White
- HDU 5583 Kingdom of Black and White 暴力
- HDU 5583 Kingdom of Black and White
- HDU 5583 Kingdom of Black and White
- HDU-5583-Kingdom of Black and White【2015上海赛区】【暴力】
- HDU-5583-Kingdom of Black and White(2015ACM/ICPC亚洲区上海站-重现赛)
- HDU 5583 Kingdom of Black and White
- HDU 5583 Kingdom of Black and White
- HDU5583 Kingdom of Black and White