[ZPG TEST 115] 字符串【归类思想】

pdf效果太差,转成word效果依旧差,只好转成jpg传了。
这一题用到了“归类”的思想,令s(i, a)表示前i个字体,字符a出现的次数。那么ans一定等于一个
( s(i, a) - s(j, a) ) - ( s(i, b) - s(j, b) ),
归一下类,得到ans等于一个
( s(i, a) - s(i, b) ) - ( s(j, a) - s(j, b) ).
所以我们只需要读入一个字符a,然后枚举那个字符b,在用上式计算答案,要保存前面的s(j, a) - s(j, b)的最小值。
然而还是有一种特殊情况,举个例子,aaabbbb,如果直接向上面那样做得到的答案是4,对应的是bbbb那一串,即4个b减去0个a,但是出现0次并不算出现,所以我们需要保存一个cj[26][26],其中cj[a][b]表示s(j, a) - s(j, b)取到最小值时,b字符出现的个数。那么如果s(i, b) == cj(a, b)的话,就不能更新答案,因为这一段是没有字符b的。
#include <cstdio>
#include <algorithm>
#include <cstring> const int maxn = 1000005; int n, a[maxn], mn[30][30], ans, s[30], cj[30][30];
char ch; int main(void) {
freopen("string.in", "r", stdin);
freopen("string.out", "w", stdout);
scanf("%d", &n);
while ((ch = getchar()) < 'a');
a[1] = ch - 'a';
for (int i = 2; i <= n; ++i) {
a[i] = getchar() - 'a';
} for (int i = 1; i <= n; ++i) {
++s[a[i]];
for (int j = 0; j < 26; ++j) {
if (a[i] == j) {
continue;
}
if (s[a[i]] > s[j]) {
if (s[j] > cj[a[i]][j]) {
ans = std::max(ans, s[a[i]] - s[j] - mn[a[i]][j]);
}
}
else if (s[a[i]] < s[j]) {
ans = std::max(ans, s[j] - s[a[i]] - mn[j][a[i]]);
} if (s[a[i]] - s[j] < mn[a[i]][j]) {
mn[a[i]][j] = s[a[i]] - s[j];
cj[a[i]][j] = s[j];
}
if (s[j] - s[a[i]] < mn[j][a[i]]) {
mn[j][a[i]] = s[j] - s[a[i]];
cj[j][a[i]] = s[a[i]];
}
}
}
printf("%d\n", ans);
return 0;
}
[ZPG TEST 115] 字符串【归类思想】的更多相关文章
- [剑指Offer]46-把数字翻译成字符串(递归思想,循环实现)
题意 '0'到'25'翻译成'a'到'z',故一个字符串可以有多种翻译方式,如12258有五种翻译方式. 给定字符串,输出有多少种翻译方式 解题思路 递归思想 计f(i)为以第i个字符开始到原字符串结 ...
- [ZPG TEST 115] 种树【差分约束】
4. 种树 (trees.pas/c/cpp) [问题描述] 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号为1..n.每个块的大小为一个单位尺寸并最多可种一 ...
- LeetCode344 反转字符串
编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh" 示例 2: 输入: "A man, a p ...
- 用map来统计数组中各个字符串的数量
1.背景 想要统计这一个字符串数组中每一个非重复字符串的数量,使用map来保存其key和value.这个需求在实际开发中经常使用到,我以前总是新建一个空数组来记录不重复字符串,并使用计数器计数,效率低 ...
- java----String解析
String在内存中的分析: public class Demo { public static void main(String[] args){ String a = new String(&qu ...
- POJ 2774 Long Long Message ——后缀数组
[题目分析] 用height数组RMQ的性质去求最长的公共子串. 要求sa[i]和sa[i-1]必须在两个串中,然后取height的MAX. 利用中间的字符来连接两个字符串的思想很巧妙,记得最后还需要 ...
- java基础-基本数据类型
浏览以下内容前,请点击并阅读 声明 java有八种基本数据类型,其中包括: byte,字节型,是8位带符号的整数,即其范围在-128和127之间(包括) short,短整型,是16位带符号的整数,范围 ...
- shell 删除文件下的* (copy).jpg备份文件
shell编程中, 在for, while循环中为什么不用(), {} 不是没有; 而是因为(), {}做了其他用途: (): 执行命令组, 注意这个命令组是新开一个子shell中执行, 因此,括号 ...
- [SQL] 函数整理(T-SQL 版)
函数整理(T-SQL 版) 一.数学函数 1.求绝对值 ABS() 函数用来返回一个数值的绝对值. SELECT ABS(-5.38) AS absValue; 2.求指数 POWER() 函数是用 ...
随机推荐
- 从头开始学Android之(一)——— Android架构
从事Android开发已经两年多了,最近项目上特别清闲,刚开始时在闲暇的时候都不知道干嘛,整天混日子.有一天突然有个以前同学找到我,说要我帮忙做一个Android的需求,就是在后台截屏(涉及到服务以及 ...
- 【独立开发人员er Cocos2d-x实战 008】BMFont生成位图字体工具和Cocos2dx使用载入fnt文件
1.首先我们须要下载而且安装BMFont工具,下载地址例如以下:http://download.csdn.net/detail/chenqiai0/8899353(里面还有具体的使用文档,假设使用中有 ...
- Wi-Fi无线网络(WPA2加密)快速破解 ——某公司无线设备安全隐患报告
Wi-Fi无线网络(WPA2加密)快速破解 --某公司无线设备安全隐患报告 评估人:阿牛 2013年12月12日 文件夹 一. 导言 2 二. 背景 2 三. 无线产品应当採取的安全策略 3 四. 存 ...
- INTERSECT(交集)集合运算
在集合论中,两个集合(记为集合A和B)的交集是由既属于A,也属于B的所有元素组成的集合. 在T-SQL 中,INTERSECT 集合运算对两个输入查询的结果集取其交集,只返回在两个查询结果集中都出现的 ...
- 加密壳之ACProtect之OEP的处理
菜驹也玩加密壳之ACProtect之OEP的处理 附件下载:加壳文件和pdf 1. 加密过程: ACProctect v1.41版本号 分析对OEP入口点代码的偷取 2. 分析过程 ...
- Hibernate中Criteria的完整用法?
http://www.cnblogs.com/mabaishui/archive/2009/10/16/1584510.html
- JavaScript语言基础4
谈谈JavaScript 中的变量. 在JavaScript 中使用变量的优点:变量保存在计算机的内存中,变量很适合于保存暂时性的数据 ,变量仅仅具有有限的生存期,当 用户关闭了页面或者打开一个新的页 ...
- javaScript改变HTML
改变HTML输出流: 在JavaScript中,document.write() 可用于直接向HTML输出流写内容 <!DOCTYPE html> <html> <bod ...
- easyUI下拉列表点击事件的使用
可以通过input 和select来创建下拉列表 其中select的创建如下: 通过json来创建js数组 [{ "id":1, "text":"te ...
- mac系统下命令编译android ndk项目
1.设置ndk环境变量 2.构造android ndk项目,命令:ndk-build 3.使用ant构造android sdk项目:命令:android update project -p . -n ...