博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2213: [Poi2011]Difference
阅读量:6540 次
发布时间:2019-06-24

本文共 2494 字,大约阅读时间需要 8 分钟。

Description

A word consisting of lower-case letters of the English alphabet ('a'-'z') is given. We would like to choose a non-empty contiguous (i.e. one-piece) fragment of the word so as to maximise the difference in the number of occurrences of the most and the least frequent letter in the fragment. We are assuming that the least frequent letter has to occur at least once in the resulting fragment. In particular, should the fragment contain occurrences of only one letter, then the most and the least frequent letter in it coincide.

已知一个长度为n的由小写字母组成的字符串,求其中连续的一段,满足该段中出现最多的字母出现的个数减去该段中出现最少的字母出现的个数最大。求这个个数。

Input

The first line of the standard input holds one integer (1<=N<=1000000)() that denotes the length of the word. The second line holds a word consisting of lower-case letters of the English alphabet.

第一行,n

第二行,该字符串
1<=n<=1000000

Output

The first and only line of the standard output is to hold a single integer, equal to the maximum difference in the number of occurrences of the most and the least frequent letter that is attained in some non-empty contiguous fragment of the input word.

一行,表示结果

Sample Input

10
aabbaaabab

Sample Output

3
Explanation of the example: The fragment that attains the difference of 3 in the number of occurrences of a and b is aaaba.
————————————————————————————————————————————
这道题我们从1扫到n 每次经过一个位置 只会改变一个字母的出现次数
我们可以把

转换成

我们用s[i]表示i这个字母的出现次数  f[i][j]表示前面某一时刻s[i]-s[j]的最小值

p[i][j]表示最小值转移时候的位置 last[i]表示i上次出现的位置

这样就完美解决答案了辣2333

#include
#include
#include
using std::max;using std::min;const int M=1e6+7,inf=0x3f3f3f3f;int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f;}char c[M];int ans,n,f[26][26],s[26],last[26],p[26][26];int main(){ n=read(); scanf("%s",c+1); for(int i=1;i<=n;i++){ int now=c[i]-'a'; s[now]++; last[now]=i; for(int j=0;j<26;j++){ if(j!=now&&s[j]) ans=max(ans,(s[now]-s[j])-f[now][j]-(p[now][j]==last[j])); if(j!=now&&s[j]) ans=max(ans,(s[j]-s[now])-f[j][now]-(p[j][now]==last[now])); } for(int j=0;j<26;j++){ if(f[j][now]>s[j]-s[now]) f[j][now]=s[j]-s[now],p[j][now]=i; if(f[now][j]>s[now]-s[j]) f[now][j]=s[now]-s[j],p[now][j]=i; } } printf("%d\n",ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7700414.html

你可能感兴趣的文章
Android文件的加密与解密
查看>>
SOAP webserivce 和 RESTful webservice 对比及区别
查看>>
【原】记录一句话
查看>>
Android标题栏,状态栏
查看>>
三数中值快速排序(长度小于3的数组转插入排序)
查看>>
Windows下安装Memcached for PHP
查看>>
hdu 1040 As Easy As A+B
查看>>
java笔记:SpringSecurity应用(二)
查看>>
vim命令
查看>>
php记录代码执行时间
查看>>
【C】strcpy()需谨慎使用;
查看>>
用Adobe Flash Professional CS6创建一个iOS应用程序
查看>>
简简单单几段代码让自己变成最合格的网站管理员
查看>>
Slim Text 0.0.9 发布, 代码开源!
查看>>
[置顶] 遵循Java EE标准体系的开源GIS服务平台之二:平台部署
查看>>
Session深度探索
查看>>
shell语法简单介绍
查看>>
wcf客户端终结点样本集合
查看>>
Java递归算法——阶乘
查看>>
ios开发应用内实现多语言自由切换
查看>>