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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5583

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

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 
20 using namespace std;
21 
22 typedef long long ll;
23 const int maxn = 100010;
24 int n;
25 char s[maxn];
26 ll grid[maxn];
27 
28 int main() {
29     // freopen("in", "r", stdin);
30     int T;
31     scanf("%d", &T);
32     for(int _ = 1; _ <= T; _++) {
33         scanf("%s", s);
34         memset(grid, 0, sizeof(grid));
35         ll cur = 0, ans = 0;
36         n = 0; grid[n] = 1;
37         for(int i = 1; s[i]; i++) s[i] == s[i-1] ? grid[n]++ : grid[++n] = 1;
38         for(int i = 0; i <= n; i++)    cur += grid[i] * grid[i];
39         if(n == 0) ans = grid[0] * grid[0];
40         else {
41             for(int i = 1; i <= n; i++) {
42                 if(grid[i] == 1) ans = max(cur+2*(grid[i-1]*grid[i+1]+grid[i-1]+grid[i+1]), ans);
43                 else {
44                     if(grid[i-1] >= grid[i]) 
45                         ans = max(cur+2*(grid[i-1]-grid[i]+1), ans);
46                     else 
47                         ans = max(cur+2*(grid[i]-grid[i-1]+1), ans);
48                 }
49             }
50         }
51         printf("Case #%d: %I64d\n", _, ans);
52     }
53     return 0;
54 }

 

posted @ 2016-04-20 14:22  Kirai  阅读(157)  评论(0编辑  收藏  举报