您的位置:首页 > 其它

[HDOJ5583]Kingdom of Black and White(暴力)

2016-04-20 14:22 197 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5583

一个01串,求修改一个位置,使得所有数均为0或1的子串长度的平方和最大。先分块,然后统计好原来的结果,每次更新块,更新最大值。

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>

using namespace std;

typedef long long ll;
const int maxn = 100010;
int n;
char s[maxn];
ll grid[maxn];

int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
for(int _ = 1; _ <= T; _++) {
scanf("%s", s);
memset(grid, 0, sizeof(grid));
ll cur = 0, ans = 0;
n = 0; grid
= 1;
for(int i = 1; s[i]; i++) s[i] == s[i-1] ? grid
++ : grid[++n] = 1;
for(int i = 0; i <= n; i++)    cur += grid[i] * grid[i];
if(n == 0) ans = grid[0] * grid[0];
else {
for(int i = 1; i <= n; i++) {
if(grid[i] == 1) ans = max(cur+2*(grid[i-1]*grid[i+1]+grid[i-1]+grid[i+1]), ans);
else {
if(grid[i-1] >= grid[i])
ans = max(cur+2*(grid[i-1]-grid[i]+1), ans);
else
ans = max(cur+2*(grid[i]-grid[i-1]+1), ans);
}
}
}
printf("Case #%d: %I64d\n", _, ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: