今天颓了一天T T

  这题有两种写法...

  ①预处理出每种字符在原字符串中的位置,枚举两种字符作为最大值和最小值,把这两种字符的坐标归并排序,把最大值设为1,最小值设为-1,求最大子段和。注意因为最小值必须出现一次,所以要记录前缀最小值和次小值,答案只更新最小值出现次数不为0的一个,对于一个字符的出现次数用当前出现次数是否等于前缀最小值出现次数来判断就好了,复杂度O(50N)。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. const int maxn=,inf=1e9;
  9. int n,ans,cnt;
  10. int num[maxn],sum[maxn],last[maxn],pre[maxn],q[maxn];
  11. char s[maxn];
  12. inline void read(int &k)
  13. {
  14. int f=;k=;char c=getchar();
  15. while(c<''||c>'')c=='-'&&(f=-),c=getchar();
  16. while(c<=''&&c>='')k=k*+c-'',c=getchar();
  17. k*=f;
  18. }
  19. void solve(int x,int y)
  20. {
  21. int mn1=,mn2=inf,frt1=;
  22. for(int i=;i<=cnt;i++)
  23. {
  24. num[i]=num[i-]+(s[q[i]]-'a'==y);
  25. sum[i]=sum[i-]+(s[q[i]]-'a'==x?:-);
  26. if(num[i]==frt1)mn1=min(mn1,sum[i]);
  27. else if(sum[i]<mn1)mn2=mn1,mn1=sum[i],frt1=num[i];
  28. else if(sum[i]<mn2)mn2=sum[i];
  29. if(num[i]-frt1>)ans=max(ans,sum[i]-mn1);
  30. else ans=max(ans,sum[i]-mn2);
  31. }
  32. }
  33. int main()
  34. {
  35. read(n);scanf("%s",s+);
  36. for(int i=;i<=n;i++)pre[i]=last[s[i]-'a'],last[s[i]-'a']=i;
  37. for(int i=;i<;i++)
  38. for(int j=;j<i;j++)
  39. if(last[i]&&last[j])
  40. {
  41. cnt=;int l1=last[i],l2=last[j];
  42. while(l1||l2)
  43. if(l1>l2)q[++cnt]=l1,l1=pre[l1];
  44. else q[++cnt]=l2,l2=pre[l2];
  45. solve(i,j);solve(j,i);
  46. }
  47. printf("%d\n",ans);
  48. }

  ②对于两个字符计算答案为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)。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. const int maxn=,inf=1e9;
  9. int n,ans;
  10. int num[][],cnt[],g1[][],g2[][],f[][];
  11. char s[maxn];
  12. inline void read(int &k)
  13. {
  14. int f=;k=;char c=getchar();
  15. while(c<''||c>'')c=='-'&&(f=-),c=getchar();
  16. while(c<=''&&c>='')k=k*+c-'',c=getchar();
  17. k*=f;
  18. }
  19. void solve(int x,int y)
  20. {
  21. if(num[x][y]==cnt[y])g1[x][y]=min(g1[x][y],f[x][y]);
  22. 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];
  23. else if(f[x][y]<g2[x][y])g2[x][y]=f[x][y];
  24. if(num[x][y]!=cnt[y])ans=max(ans,f[x][y]-g1[x][y]);
  25. else ans=max(ans,f[x][y]-g2[x][y]);
  26. }
  27. int main()
  28. {
  29. read(n);scanf("%s",s+);
  30. memset(g2,,sizeof(g2));
  31. for(int i=;i<=n;i++)
  32. {
  33. cnt[s[i]-'a']++;
  34. for(int j=;j<;j++)
  35. 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');
  36. }
  37. printf("%d\n",ans);
  38. }

bzoj2213: [Poi2011]Difference(思维题)的更多相关文章

  1. BZOJ2213: [Poi2011]Difference

    2213: [Poi2011]Difference Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 343  Solved: 108[Submit][St ...

  2. BZOJ2213[Poi2011]Difference——DP

    题目描述 A word consisting of lower-case letters of the English alphabet ('a'-'z') is given. We would li ...

  3. BZOJ2213 [Poi2011]Difference 【乱搞】

    题目链接 BZOJ2213 题解 考虑任意一对点的贡献,单独拿出那些点所在位置 一个设为\(1\),一个设为\(-1\),从头到尾扫一遍维护前缀和,以及当前最小前缀和 两者相减更新答案 需要注意的是当 ...

  4. 【BZOJ2213】[Poi2011]Difference DP

    [BZOJ2213][Poi2011]Difference Description A word consisting of lower-case letters of the English alp ...

  5. [bzoj2213][Poi2011]Difference_动态规划

    Difference bzoj-2213 Poi-2011 题目大意:已知一个长度为n的由小写字母组成的字符串,求其中连续的一段,满足该段中出现最多的字母出现的个数减去该段中出现最少的字母出现的个数最 ...

  6. zoj 3778 Talented Chef(思维题)

    题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...

  7. cf A. Inna and Pink Pony(思维题)

    题目:http://codeforces.com/contest/374/problem/A 题意:求到达边界的最小步数.. 刚开始以为是 bfs,不过数据10^6太大了,肯定不是... 一个思维题, ...

  8. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

  9. 洛谷P4643 [国家集训队]阿狸和桃子的游戏(思维题+贪心)

    思维题,好题 把每条边的边权平分到这条边的两个顶点上,之后就是个sb贪心了 正确性证明: 如果一条边的两个顶点被一个人选了,一整条边的贡献就凑齐了 如果分别被两个人选了,一作差就抵消了,相当于谁都没有 ...

随机推荐

  1. Visual Studio设置字体及护眼背景色

    打开vs 菜单栏选择: 工具 -> 选择 -> 环境 -> 字体和颜色,如图所示 字体可以如上选择,背景色选择项背景,点击自定义,如下设置即可.

  2. ython进阶06 循环对象

    这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标 ...

  3. 3星|麦肯锡合伙人《从1到N》:PPT讲稿,图表不错,讲解不够深入

    从1到N:企业数字化生存指南 两位作者是麦肯锡合伙人.全书插图比较多,图做的还比较有水平.但是相关文字不够深入,我读后的感觉是:图表不是两位执笔者做的,他们对细节不清楚,对图表涉及到的行业也缺乏深入的 ...

  4. Action Required: Listings Deactivated for Potential Pricing Error

    Dear Seller, We are contacting you because we have detected potential pricing errors in your Amazon. ...

  5. Sublime Text 2 - Unable to find git.exe 错误

    今日打开 Sublime Text 2,随即弹出 Package Control - Unable to find git.exe 错误.如下, 原因:曾经通过 git clone 命令获取过 Sub ...

  6. Immutable 常用API简介

    本文主要整理了Immutable.js常用API的使用. Immutable 是什么? 关于Immutable的定义,官方文档是这样说的: Immutable data encourages pure ...

  7. AngularJS学习之MVC模式

    AngularJS是谷歌开发维护的前端MVC框架,克服了HTML在构建应用上的不足,从而降低了开发的成本. 在学习AngularJS之前,有必要和之前学过的jQuery进行对比.jQuery是java ...

  8. Thunder团队第七周 - Scrum会议4

    Scrum会议4 小组名称:Thunder 项目名称:i阅app Scrum Master:翟宇豪 工作照片: 宋雨在照相,所以不在相片中. 参会成员: 王航:http://www.cnblogs.c ...

  9. C++:const_cast的简单理解

    前言:const_cast是我比较头疼的一个知识点,最近查阅了很多资料,也翻看了很多他人的博客,故在此将自己目前学习到的有关const_cast知识做一个简单的总结 一.什么是const_cast 简 ...

  10. larave5.6 引入自定义函数库时,报错不能重复定义

    方法一:使用function_exists判断 方法二:使用命名空间 namespace test; function test(){ echo 'test/test'; } namespace te ...