题目链接: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 ", _, ans); 52 } 53 return 0; 54 }