hdu 5583 Kingdom of Black and White(模拟,技巧)
In the Kingdom of Black and White (KBW), there are two kinds of frogs: black frog and white frog. Now N frogs are standing in a line, some of them are black, the others are white. The total strength of those frogs are calculated by dividing the line into minimum parts, each part should still be continuous, and can only contain one kind of frog. Then the strength is the sum of the squared length for each part. However, an old, evil witch comes, and tells the frogs that she will change the color of at most one frog and thus the strength of those frogs might change. The frogs wonder the maximum possible strength after the witch finishes her job.
First line contains an integer T, which indicates the number of test cases. Every test case only contains a string with length N, including only (representing
a black frog) and (representing a white frog). ⋅ ≤T≤. ⋅ for % data, ≤N≤. ⋅ for % data, ≤N≤. ⋅ the string only contains and .
For every test case, you should output "Case #x: y",where x indicates the case number and counts from and y is the answer.
Case #:
Case #:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<bitset>
#include<map>
#include<vector>
#include<stdlib.h>
#include <stack>
using namespace std;
#define PI acos(-1.0)
#define max(a,b) (a) > (b) ? (a) : (b)
#define min(a,b) (a) < (b) ? (a) : (b)
#define ll long long
#define eps 1e-10
#define MOD 1000000007
#define N 100006
#define inf 1e12
struct Node{
char c;
ll len;
}node[N];
char s[N];
int main()
{
int t;
ll ac=;
scanf("%I64d",&t);
while(t--){
for(ll i=;i<N;i++){
node[i].len=;
}
scanf("%s",s);
ll len=strlen(s);
ll k=;
node[k].c=s[];
node[k].len++;
ll now=;
for(ll i=;i<len;i++){
if(s[i]==s[now]){
node[k].len++;
now++;
}else{
k++;
node[k].c=s[i];
node[k].len++;
now++;
}
}
//for(ll i=0;i<=k;i++){
// prllf("%c %d\n",node[i].c,node[i].len);
//}
ll ans=;
for(ll i=;i<=k;i++){
ans+=node[i].len*node[i].len;
}
ll sum=ans; //prllf("%d\n",ans);
for(ll i=;i<=k;i++){
if(node[i].len==){ if(i==){
ll new_num=;
ll old_num=;
new_num=(node[].len+)*(node[].len+);
old_num=(node[].len)*(node[].len)+(node[].len)*(node[].len);
ans=max(ans,sum-old_num+new_num);
}else if(i==k){
ll new_num=;
ll old_num=;
new_num=(node[i-].len+)*(node[i-].len+);
old_num=(node[i].len)*(node[i].len)+(node[i-].len)*(node[i-].len);
ans=max(ans,sum-old_num+new_num);
}else{
ll new_num=;
ll old_num=; new_num=(node[i-].len+)*(node[i-].len+);
old_num=(node[i].len)*(node[i].len)+(node[i-].len)*(node[i-].len);
ans=max(ans,sum-old_num+new_num); new_num=;
old_num=; new_num=(node[i+].len+)*(node[i+].len+);
old_num=(node[i].len)*(node[i].len)+(node[i+].len)*(node[i+].len);
ans=max(ans,sum-old_num+new_num); new_num=;
old_num=;
if((node[i].c!=node[i-].c) && (node[i].c!=node[i+].c)){
new_num=(node[i-].len++node[i+].len)*(node[i-].len++node[i+].len);
old_num=(node[i].len)*(node[i].len)+(node[i+].len)*(node[i+].len)+(node[i-].len)*(node[i-].len);
ans=max(ans,sum-old_num+new_num);
}
} }else{
if(i==){ ll new_num=;
ll old_num=;
new_num+=(node[].len-)*(node[].len-);
new_num+=(node[].len+)*(node[].len+); old_num+=(node[].len)*(node[].len);
old_num+=(node[].len)*(node[].len); ans=max(ans,sum-old_num+new_num); }else if(i==k){ ll new_num=;
ll old_num=;
new_num+=(node[k].len-)*(node[k].len-);
new_num+=(node[k-].len+)*(node[k-].len+); old_num+=(node[k].len)*(node[k].len);
old_num+=(node[k-].len)*(node[k-].len); ans=max(ans,sum-old_num+new_num); }else{ ll new_num=;
ll old_num=; new_num+=(node[i-].len+)*(node[i-].len+);
new_num+=(node[i].len-)*(node[i].len-);
old_num+=(node[i].len)*(node[i].len);
old_num+=(node[i-].len)*(node[i-].len);
ans=max(ans,sum-old_num+new_num); new_num=;
old_num=;
new_num+=(node[i].len-)*(node[i].len-);
new_num+=(node[i+].len+)*(node[i+].len+);
old_num+=(node[i].len)*(node[i].len);
old_num+=(node[i+].len)*(node[i+].len);
ans=max(ans,sum-old_num+new_num);
}
}
}
printf("Case #%I64d: ",++ac);
printf("%I64d\n",ans);
}
return ;
}
hdu 5583 Kingdom of Black and White(模拟,技巧)的更多相关文章
- HDU 5583 Kingdom of Black and White 水题
Kingdom of Black and White Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showpr ...
- hdu 5583 Kingdom of Black and White
Kingdom of Black and White Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- HDU 5583 Kingdom of Black and White(暴力)
http://acm.hdu.edu.cn/showproblem.php?pid=5583 题意: 给出一个01串,现在对这串进行分组,连续相同的就分为一组,如果该组内有x个数,那么就对答案贡献x* ...
- hdu-5583 Kingdom of Black and White(数学,贪心,暴力)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5583 Kingdom of Black and White Time Limit: 2000/1000 ...
- HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力)
HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=59 ...
- hdu 4948 Kingdom(推论)
hdu 4948 Kingdom(推论) 传送门 题意: 题目问从一个城市u到一个新的城市v的必要条件是存在 以下两种路径之一 u --> v u --> w -->v 询问任意一种 ...
- HDU5583 Kingdom of Black and White
Kingdom of Black and White Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- hdu 2629 Identity Card (字符串解析模拟题)
这题是一个字符串模拟水题,给12级学弟学妹们找找自信的,嘿嘿; 题目意思就是要你讲身份证的上的省份和生日解析出来输出就可以了: http://acm.hdu.edu.cn/showproblem.ph ...
- [HDOJ5583]Kingdom of Black and White(暴力)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5583 一个01串,求修改一个位置,使得所有数均为0或1的子串长度的平方和最大.先分块,然后统计好原来的 ...
随机推荐
- 纯CSS美化的checkbox 和 radio
html <!DOCTYPE HTML> <html> <head> <title>纯CSS3实现自定义美化复选框和单选框</title> ...
- EasyUI Combotree 只允许选择 叶子节点
$("#SDID").combotree({ url: '/Ajax/GetDeptTree.aspx?level=4&pid=-1', onSelect: functio ...
- Android4.0中蓝牙适配器state machine(状态机)的分析
今天晓东和大家来一起看一下Android4.0中蓝牙适配器(Bluetooth Adapter)的状态机变化的过程.首先,我们需要了解一下,蓝牙适配器究竟有哪些状态,从代码可以清晰地看到(framew ...
- poj3233之经典矩阵乘法
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 12346 Accepted: ...
- 全国计算机等级考试二级教程-C语言程序设计_第4章_选择结构
switch什么时候用break,什么时候不用break 调用break:一次执行一个分支,输入一个数据,对应一个级别 不调用break:连续执行多个分支 if...else 可以处理任何情况,大于小 ...
- 全国计算机等级考试二级教程-C语言程序设计_第2章_C程序设计的初步知识
正负号与被除数一致. 3 % (-5) == 3 (-3) % 5 == -3 不用求余运算符,求出余数. int x, y; 答:x - x / y * y; const int i = 10; c ...
- 查询本天气预报Web Services支持的国内外城市或地区信息
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangkui.blog.51cto.com/1796259/497324 本文 ...
- JDK自带工具jps,jstat,jmap,jconsole使用
jps 与ps命令类似: ps -ef|grep java 用来显示本地的java进程,查看本地执行着几个java应用,并显示进程号. [root@SE43 ~]# jps //仅仅显示进程号 238 ...
- DoNet开源项目-基于jQuery EasyUI的后台管理系统
博主在业余时间开发了一个简单的后台管理系统,其中用到了 jQuery EasyUI 框架,上次分享过系统布局,参考文章:jQuery EasyUI 后台管理系统布局分享,目前已完成系统的整体框架的搭建 ...
- 献给写作者的 Markdown 新手指南
「简书」作为一款「写作软件」在诞生之初就支持了 Markdown,Markdown 是一种「电子邮件」风格的「标记语言」,我们强烈推荐所有写作者学习和掌握该语言.为什么?可以参考: 『为什么作家应该用 ...