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] 字符串【归类思想】的更多相关文章

  1. [剑指Offer]46-把数字翻译成字符串(递归思想,循环实现)

    题意 '0'到'25'翻译成'a'到'z',故一个字符串可以有多种翻译方式,如12258有五种翻译方式. 给定字符串,输出有多少种翻译方式 解题思路 递归思想 计f(i)为以第i个字符开始到原字符串结 ...

  2. [ZPG TEST 115] 种树【差分约束】

    4. 种树 (trees.pas/c/cpp) [问题描述] 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号为1..n.每个块的大小为一个单位尺寸并最多可种一 ...

  3. LeetCode344 反转字符串

    编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh" 示例 2: 输入: "A man, a p ...

  4. 用map来统计数组中各个字符串的数量

    1.背景 想要统计这一个字符串数组中每一个非重复字符串的数量,使用map来保存其key和value.这个需求在实际开发中经常使用到,我以前总是新建一个空数组来记录不重复字符串,并使用计数器计数,效率低 ...

  5. java----String解析

    String在内存中的分析: public class Demo { public static void main(String[] args){ String a = new String(&qu ...

  6. POJ 2774 Long Long Message ——后缀数组

    [题目分析] 用height数组RMQ的性质去求最长的公共子串. 要求sa[i]和sa[i-1]必须在两个串中,然后取height的MAX. 利用中间的字符来连接两个字符串的思想很巧妙,记得最后还需要 ...

  7. java基础-基本数据类型

    浏览以下内容前,请点击并阅读 声明 java有八种基本数据类型,其中包括: byte,字节型,是8位带符号的整数,即其范围在-128和127之间(包括) short,短整型,是16位带符号的整数,范围 ...

  8. shell 删除文件下的* (copy).jpg备份文件

    shell编程中,  在for, while循环中为什么不用(), {} 不是没有; 而是因为(), {}做了其他用途: (): 执行命令组, 注意这个命令组是新开一个子shell中执行, 因此,括号 ...

  9. [SQL] 函数整理(T-SQL 版)

    函数整理(T-SQL 版) 一.数学函数 1.求绝对值 ABS() 函数用来返回一个数值的绝对值. SELECT ABS(-5.38) AS absValue; 2.求指数 POWER()  函数是用 ...

随机推荐

  1. 小心入怀Yaf

    http://www.laruence.com/2015/05/14/3021.html, 鸟哥文章 看了这个文章,更加要小心的对待 Yaf Yar 框架了. 不正确 glib 有一定的了解进来就是深 ...

  2. centos mysql错误信息处理

    mysql_secure_installation 提示错误:Enter current password for root (enter for none):ERROR 1045 (28000): ...

  3. Hadoop在window上运行 user=Administrator, access=WRITE, inode="hadoop"

    win7下eclipse中错误的详细描述如下: org.apache.hadoop.security.AccessControlException: org.apache.hadoop.securit ...

  4. Visual Studio VS2010 如何修改默认的编辑语言

    1 比如我要把默认是C++的配置改成C#,在工具-导入和导出设置中,重置所有设置 2 这里改成新的语言 3 重置完成

  5. libevent HTTP client 的实现

    my_conn_ = evhttp_connection_base_new(ev_base_,ev_dns_,host,port); struct evhttp_request *http_req; ...

  6. 使用HD/IDE层的ioctl接口获取磁盘容量get_hdd_max_sector

    利用HD/IDE layer的ioctl函数接口获取HD/IDE的磁盘容量.HDIO_DRIVE_TASK  能发出訪问LBA地址的命令.但不能读写数据. #include <stdio.h&g ...

  7. 【iOS系列】-UIButton的非常规使用

    [iOS系列]-UIButton的非常规使用 主要介绍UIButton在开发中得小技巧,使用好了,可以达到很奇妙的效果. 1:设置按钮内边距属性,可以呈现出相框的效果 btn.contentEdgeI ...

  8. @Html.ValidationMessageFor客户端验证

    <%=Html.LabelFor(model => model.sUser) %><%=Html.TextBoxFor(model => model.sUser) %&g ...

  9. redis缓存数据库的详解

    1,什么是redis? Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis与其他key-value缓存产品有以下三个特点: Redis支持数据的持久化,可以 ...

  10. ranlib

    1 ranlib的缩写 random access library 2 ranlib的作用 为静态库的符号建立索引,可以加速链接,因此称用ranlib处理过的library为random access ...