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的子串长度的平方和最大.先分块,然后统计好原来的 ...
随机推荐
- MSBI常见问题总结
SSIS 1.对连接管理器“DC”的AcquireConnection方法调用失败,错误代码0xC0209303.可能在此之前已经发出错误消息,提供了有关AcquireConnection方法调用失败 ...
- Rule Or WorkFlow
The main value of a Workflow engine is that it makes it possible to customize the flows through some ...
- C#正则表达式匹配任意字符
原文:C#正则表达式匹配任意字符 不得不说正则很强大,尤其在字符串搜索上 匹配任意字符,包括汉字,换行符: [\s\S]*. 版权声明:本文为博主原创文章,未经博主允许不得转载.
- 【HDU 4451 Dressing】水题,组合数
有衣服.裤子.鞋数量分别为n,m,k,给出p对不和谐的衣-裤或裤-鞋搭配,问一共有多少种和谐的衣裤鞋的搭配. 全部的组合有Cn1Cm1Ck1种. 设p对中有p1对衣-裤,p2对裤-鞋,则不和谐的搭配共 ...
- Anton and Lines(思维)
Anton and Lines time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 步步学LINQ to SQL:为实体类添加关系【转】
[IT168 专稿]本文详细为你阐述了如何在你的应用程序中实现LINQ to SQL.附件的示例程序包括了这里探讨的所有代码,还提供了一个简单的WPF图形界面程序来显示通过数据绑定返回的结果集. 第一 ...
- 6T GPT 移动硬盘在linux下的挂载
实验室拿来了一个6T的移动硬盘,拿到后没有分区就直接用了,在Windows上用的好好的,插到上Linux后起初不会挂载,折腾了一会,成功挂载,很简单. 运行fdisk –l后,显示如下: 很明显,sd ...
- 【十分不错】【离线+树状数组】【TOJ4105】【Lines Counting】
On the number axis, there are N lines. The two endpoints L and R of each line are integer. Give you ...
- spark基本概念
Client:客户端进程,负责提交作业到Master. Application:Spark Application的概念和Hadoop MapReduce中的类似,指的是用户编写的Spark应用程序, ...
- Linux下配置VNC
1.确认是否安装vnc服务端 : rpm -q tigervnc-server 默认是没有安装的,需要在Linux系统文件Packages文件夹找到vnc安装包(里面有两个分别是客户端与服务端)tig ...