bzoj2213: [Poi2011]Difference(思维题)
今天颓了一天T T
这题有两种写法...
①预处理出每种字符在原字符串中的位置,枚举两种字符作为最大值和最小值,把这两种字符的坐标归并排序,把最大值设为1,最小值设为-1,求最大子段和。注意因为最小值必须出现一次,所以要记录前缀最小值和次小值,答案只更新最小值出现次数不为0的一个,对于一个字符的出现次数用当前出现次数是否等于前缀最小值出现次数来判断就好了,复杂度O(50N)。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=,inf=1e9;
int n,ans,cnt;
int num[maxn],sum[maxn],last[maxn],pre[maxn],q[maxn];
char s[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void solve(int x,int y)
{
int mn1=,mn2=inf,frt1=;
for(int i=;i<=cnt;i++)
{
num[i]=num[i-]+(s[q[i]]-'a'==y);
sum[i]=sum[i-]+(s[q[i]]-'a'==x?:-);
if(num[i]==frt1)mn1=min(mn1,sum[i]);
else if(sum[i]<mn1)mn2=mn1,mn1=sum[i],frt1=num[i];
else if(sum[i]<mn2)mn2=sum[i];
if(num[i]-frt1>)ans=max(ans,sum[i]-mn1);
else ans=max(ans,sum[i]-mn2);
}
}
int main()
{
read(n);scanf("%s",s+);
for(int i=;i<=n;i++)pre[i]=last[s[i]-'a'],last[s[i]-'a']=i;
for(int i=;i<;i++)
for(int j=;j<i;j++)
if(last[i]&&last[j])
{
cnt=;int l1=last[i],l2=last[j];
while(l1||l2)
if(l1>l2)q[++cnt]=l1,l1=pre[l1];
else q[++cnt]=l2,l2=pre[l2];
solve(i,j);solve(j,i);
}
printf("%d\n",ans);
}
②对于两个字符计算答案为cnt[r][a]-cnt[l][a]-(cnt[r][b]-cnt[l][b]),可以转化成cnt[r][a]-cnt[r][b]和cnt[l][a]-cnt[l][b],于是我们只要记录一下当前值和前面的最小值,次小值,更新一个前缀y的数量不一样的就好了。因为每移动一格只会更新50个cnt,于是复杂度为O(50N)。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=,inf=1e9;
int n,ans;
int num[][],cnt[],g1[][],g2[][],f[][];
char s[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void solve(int x,int y)
{
if(num[x][y]==cnt[y])g1[x][y]=min(g1[x][y],f[x][y]);
else if(f[x][y]<g1[x][y])g2[x][y]=g1[x][y],g1[x][y]=f[x][y],num[x][y]=cnt[y];
else if(f[x][y]<g2[x][y])g2[x][y]=f[x][y];
if(num[x][y]!=cnt[y])ans=max(ans,f[x][y]-g1[x][y]);
else ans=max(ans,f[x][y]-g2[x][y]);
}
int main()
{
read(n);scanf("%s",s+);
memset(g2,,sizeof(g2));
for(int i=;i<=n;i++)
{
cnt[s[i]-'a']++;
for(int j=;j<;j++)
if(s[i]-'a'!=j)f[s[i]-'a'][j]++,solve(s[i]-'a',j),f[j][s[i]-'a']--,solve(j,s[i]-'a');
}
printf("%d\n",ans);
}
bzoj2213: [Poi2011]Difference(思维题)的更多相关文章
- BZOJ2213: [Poi2011]Difference
2213: [Poi2011]Difference Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 343 Solved: 108[Submit][St ...
- BZOJ2213[Poi2011]Difference——DP
题目描述 A word consisting of lower-case letters of the English alphabet ('a'-'z') is given. We would li ...
- BZOJ2213 [Poi2011]Difference 【乱搞】
题目链接 BZOJ2213 题解 考虑任意一对点的贡献,单独拿出那些点所在位置 一个设为\(1\),一个设为\(-1\),从头到尾扫一遍维护前缀和,以及当前最小前缀和 两者相减更新答案 需要注意的是当 ...
- 【BZOJ2213】[Poi2011]Difference DP
[BZOJ2213][Poi2011]Difference Description A word consisting of lower-case letters of the English alp ...
- [bzoj2213][Poi2011]Difference_动态规划
Difference bzoj-2213 Poi-2011 题目大意:已知一个长度为n的由小写字母组成的字符串,求其中连续的一段,满足该段中出现最多的字母出现的个数减去该段中出现最少的字母出现的个数最 ...
- zoj 3778 Talented Chef(思维题)
题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...
- cf A. Inna and Pink Pony(思维题)
题目:http://codeforces.com/contest/374/problem/A 题意:求到达边界的最小步数.. 刚开始以为是 bfs,不过数据10^6太大了,肯定不是... 一个思维题, ...
- ZOJ 3829 贪心 思维题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...
- 洛谷P4643 [国家集训队]阿狸和桃子的游戏(思维题+贪心)
思维题,好题 把每条边的边权平分到这条边的两个顶点上,之后就是个sb贪心了 正确性证明: 如果一条边的两个顶点被一个人选了,一整条边的贡献就凑齐了 如果分别被两个人选了,一作差就抵消了,相当于谁都没有 ...
随机推荐
- C语言--指针详解
这段时间在看 Linux 内核,深觉 C 语言功底不扎实,很多代码都看不太懂,深入学习巩固 C 语言的知识很有必要.先从指针开始. 一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字 ...
- 阿里IPO法律咨询费达1580万美元 为Facebook六倍
据路透社报道,阿里巴巴集团周五在 IPO (首次公开招股)更新文件中披露,将向美国盛信律师事务所(Simpson Thacher)以及其他为 IPO 提供咨询服务的律师事务所支付 1580 万美元的法 ...
- ntp时钟服务器配置
集群中时间不同步有可能会让大数据的应用程序运行混乱,造成不可预知的问题,比如Hbase,当时间差别过大时就会挂掉,所以在大数据集群中,ntp服务,应该作为一种基础的服务,以下在演示在CentOS 7. ...
- php-fpm配置
[global] error_log = /letv/log/php-fpm_error.log [www] user = apache group = apache listen = 127.0.0 ...
- Flip the Bits(思维)
You are given a positive integer n. Your task is to build a number m by flipping the minimum number ...
- 王者荣耀交流协会第6次Scrum立会
Scrum master :刘耀泽 任思佳的导入excel原型博客地址:http://www.cnblogs.com/rensijia/p/7766812.html 王玉玲psp表格记录功能博客地址: ...
- 寒假c++学习计划
课程选择 概览 清华大学 C++语言程序设计基础 深入学习 清华大学 C++语言程序设计进阶 (2015年秋) 理由 清华大学郑莉老师的课浅显易懂,很适合我这种小白,再加上学习过c语言理解c++基础并 ...
- HDU 5646 DZY Loves Partition
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5646 bc:http://bestcoder.hdu.edu.cn/contests/con ...
- package分析
由于大家对package的使用存在太多困惑,我在这里将自己对于package的使用的领悟进行一点总结: package中所存放的文件 所有文件,不过一般分一下就分这三种 1,java程序源文件,扩展名 ...
- 运维学习笔记(七)之T02-01计算机网络 、 数制 、 网络通信参考模型
计算机网络 计算机网络概述 什么是计算机网络 硬件方面:通过线缆将网络设备和计算机连接起来 软件方面:操作系统.应用软件.应用程序通过通信线路互连 实现资源共享.信息传递 功能 数据通信/资源共享/增 ...