首页 > 其他分享 >前缀和和后缀和

前缀和和后缀和

时间:2023-11-28 13:24:26浏览次数:29  
标签:arr 前缀 vis 后缀 memset brr int sizeof

1.Problem - 1791D - Codeforces

定义函数 f⁡()f() 表示字符串 x 中不同字符的数量。

现给定一个字符串 S,将它分割为两个字符串 a,b。求出:max⁡(f⁡()+f⁡())max(f(a)+f(b))。

我们可以搞一个前缀和 a 和一个后缀和 b,分别表示 f⁡(S1​∼Si​) 和 f(Si​∼Sn​)。

然后枚举分界点即可。

 1 #include <bits/stdc++.h>
 2 #define re register
 3 
 4 using namespace std;
 5 
 6 const int N = 2e5 + 10,M = 230;
 7 int T,n;
 8 int arr[N],brr[N];
 9 string s;
10 bool vis[M];
11 
12 int main(){
13     cin >> T;
14     while (T--){
15         int ans = 0;
16         memset(arr,0,sizeof(arr));
17         memset(brr,0,sizeof(brr));
18         memset(vis,false,sizeof(vis));
19         cin >> n >> s;
20         s = ' ' + s;
21         for (re int i = 1;i <= n;i++){//前缀和 
22             if (!vis[s[i]]){
23                 arr[i] = arr[i - 1] + 1;
24                 vis[s[i]] = true;
25             }
26             else arr[i] = arr[i - 1];
27         }
28         memset(vis,false,sizeof(vis));
29         for (re int i = n;i;i--){//后缀和 
30             if (!vis[s[i]]){
31                 brr[i] = brr[i + 1] + 1;
32                 vis[s[i]] = true;
33             }
34             else brr[i] = brr[i + 1];
35         }
36         for (re int i = 0;i <= n;i++) ans = max(ans,arr[i] + brr[i + 1]);//选出 max 
37         printf("%d\n",ans);
38     }
39     return 0;
40 }
View Code

 

标签:arr,前缀,vis,后缀,memset,brr,int,sizeof
From: https://www.cnblogs.com/rw666/p/17861719.html

相关文章

  • 前缀和算法总结
    前缀和思维导图:一维前缀和算法模版:1#include<iostream>23usingnamespacestd;45constintN=100010;67intn,m;8ints[N];910intmain()11{12scanf("%d%d",&n,&m);13for(inti=1;i<=n;i++)14......
  • 907. 子数组的最小值之和(贡献法,单调栈,前后缀分解)
     题目不难,但是涉及到的知识点很丰富。classSolution:defsumSubarrayMins(self,arr:List[int])->int:MOD=10**9+7n=len(arr)pre=[-1]*nsuf=[n]*nstk=[]foriinrange(n):w......
  • 逆波兰表达式(后缀表达式)
    逆波兰表达式1.后缀表达式首先将逆波兰的数字和符号分割开来,再通过将后缀表达式放到ArrayList中,然后配合栈来完成计算。后缀表达式计算结果过程1.如果是数则直接入栈,通过正则表达式取数(包含多位数)2.如果是运算符,则先弹出两个数,运算完成后(注意减法和除法后弹出数是被减数/被除......
  • (字符串)02-最长公共前缀
    1importjava.util.*;23publicclassSolution{4/**5*@paramstrsstring字符串一维数组6*@returnstring字符串7*/8publicStringlongestCommonPrefix(String[]strs){9//判空数组10if(strs.lengt......
  • 前缀和、差分
    前缀和、差分前缀和可以快速求区间和。差分相当于前缀和的逆运算。前缀和、差分都是以空间换时间的算法前缀和定义前缀和可以简单理解为「数列的前n项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。一维前缀和题目一LuoguP8218【深进1.例1】求区间和#in......
  • 差分与前缀和学习笔记
    本来是不想写这篇博客的,但为了课前十分钟还是来水一发前缀和简介继续引用OI-Wiki的话(OI-Wiki$yyds$!):前缀和可以简单理解为「数列的前$n$项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。也就是说,我们能使用$O(n)$的时间进行预处理,在$O(1)$的时间内求出......
  • acwing 第 130 场周赛  (前缀和,dfs,对不同边的处理)
      #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<climits>usingnamespacestd;typedeflonglongLL;constintN=5010;intn;inta[N];LLs[N];LLget(intl,intr){return......
  • 前缀和
    前缀和1.前缀和简介前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,(而差分可以看成前缀和的逆运算).合理的使用前缀和与差分,可以将某些复杂的问题简单化。2.前缀和好处求数组的某个区间的和时,最容易想出暴力算法,遍历区间求和,时间复杂度为O(n*m)而使用前缀......
  • 哈夫曼编码及前缀码的实现
    哈夫曼编码我们的任务是选一篇英语文章统计每个字符的概率,并实现哈夫曼前缀编码所选文章内容:lifeistooshorttospendtimewithpeoplewhosuckthehappinessoutofyouifsomeonewantsyouintheirlifetheyllmakeroomforyouYoushouldnthavetofightfor......
  • DHCPv6 PD(Prefix Delegation)前缀代理
    概念DHCPv6前缀代理DHCPv6PD(PrefixDelegation)是一种前缀分配机制,通过DHCPv6前缀代理机制,下游网络设备不需要再手工指定用户侧链路的IPv6地址前缀,它只需要向上游网络设备提出前缀分配申请,上游网络设备便可以分配合适的地址前缀给下游设备,下游设备把获得的前缀再通过路由通告(RA)......