HDU5583 上海赛铜牌题
2016-03-11 10:52
423 查看
这道题的意思是给你一个01串, 定义这串的优美值为连续相同的数字的平方和, 现在可以改变这些串中一个字符, 问你优美值最大是多少? 我们可以预处理出d1[i]i左边和str[i]相同的字符个数, d2[i]i右边和str[i]相同的字符个数, 对于一个i, 我们可以进行如下分类, i周围的两个元素和i都不相同, 有一个相同, 两个都相同, 按照这个规律扫一遍即可得出答案, 代码如下:
#include <bits/stdc++.h> using namespace std; typedef long long LL; char str[100000 + 100]; int d1[100000+100], d2[100000 + 100]; LL n2(LL a) { return a*a; } int main() { int T; scanf("%d", &T); int kase = 0; while(T--) { scanf("%s", str+1); int len = strlen(str+1); memset(d1, 0, sizeof(d1)); memset(d2, 0, sizeof(d2)); LL res = 0; for(int i=1; i<=len; i++) { if(i>1 && str[i]!=str[i-1]) { res += (LL)d1[i-1]*(LL)d1[i-1]; d1[i] = 1; } else d1[i] = d1[i-1]+1; } res += (LL)d1[len]*(LL)d1[len]; for(int i=len; i>=1; i--) { if(i<len && str[i]!=str[i+1]) d2[i] = 1; else d2[i] = d2[i+1] + 1; } LL ans; LL ansres = res; str[0]='3', str[len+1]='3'; for(int i=1; i<=len; i++) { if(str[i]==str[i+1] && str[i]==str[i-1]) { ans = res-n2(d1[i]+d2[i]-1)+n2(d1[i]-1)+n2(d2[i]-1)+1; ansres = max(ansres, ans); } if(str[i]==str[i+1] && str[i]!=str[i-1]) { ans = res-n2(d2[i])-n2(d1[i-1])+n2(d1[i-1]+1)+n2(d2[i]-1); ansres = max(ansres, ans); } if(str[i]!=str[i+1] && str[i]==str[i-1]) { ans = res-n2(d1[i])-n2(d2[i+1])+n2(d1[i]-1)+n2(d2[i+1]+1); ansres = max(ansres, ans); } if(str[i]!=str[i-1] && str[i]!=str[i+1]) { ans = res-n2(d1[i-1])-n2(d2[i+1])-1+n2(d1[i-1]+d2[i+1]+1); ansres = max(ansres, ans); } } printf("Case #%d: %lld\n", ++kase, ansres); } return 0; }
相关文章推荐
- 统计Apache或nginx日志里访问次数最多的IP
- SVN服务器搭建和使用(二)
- Hbase完全分布式集群安装配置
- WEB项目优化:雅虎优化网站的34条法则(转)
- 深度学习与人脸识别系列(7)__人脸识别算法简要说明与总结
- 转:Android线程的创建与销毁
- git检出与创建的过程
- 十进制经纬度转换为度分秒
- 基于RulesEngine的业务规则实现
- Android消息机制之 Looper、Handler、Message的关系和运行
- ios本地添加提醒事件
- MyEclipse去除网上复制下来的代码带有的行号
- Android实现开机自动运行程序
- Linux中常用命令——查找命令对比分析
- Python使用PIL库实现验证码图片的方法
- layout_marginLeft和layout_marginStart
- 从尾到头打印链表每个节点的值。
- RHEL5.5配置SFTP-ONLY访问
- bzoj1800
- 深度学习与人脸识别系列(6)__利用训练好的vgg模型进行人脸识别(利用摄像头)