首页 > 其他分享 >ABC 308E MEX

ABC 308E MEX

时间:2024-06-03 20:44:05浏览次数:18  
标签:字符 ABC 前缀 308E cin int maxn 后缀 MEX

题意
给定长度为N的包含0,1,2的a序列,和一个长度为N的包含字符M,E,X的字符串s。对于所以符合条件的1<=i<j<k<=N,使得s[i]s[j]s[k]=="MEX"的三元组(i,j,k),请你求出所有mex(a[i],a[j],a[k])之和。mex()函数表示未出现在序列中的最小非负整数。

思路
我们先看一个非常典的题目,给你一串由a,b,c构成的字符串,请问里面能构成"abc"的子序列有多少组。这个题的思路就可以沿用于此题,我们维护一个a出现次数的前缀和,和一个c出现次数的后缀和,如果一旦遇到b这个字符,根据乘法原理,我们就用a的前缀和乘以c的后缀和,然后加到ans上去,就可以O(n)解决此题。同理,对于这个题,我们对于每个M与X,前者开三个前缀和、后者三个后缀和,表示字符为M,对应的数字是0,1,2;字符为X,对应的数字是0,1,2。然后O(n)遍历,一旦遇到了E,那么我们就对于9种情况全部操作一遍,然后算出贡献即可。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
int a[maxn];
int s[maxn]; 
int m[maxn][5];
int x[maxn][5];

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	string sss;
	cin>>sss;
	for(int i=1;i<=n;i++)
	{
		char flag=sss[i-1];
		if(flag=='M') s[i]=0;
		if(flag=='E') s[i]=1;
		if(flag=='X') s[i]=2;
	}
	for(int i=1;i<=n;i++)
	{
		m[i][0]=m[i-1][0];
		m[i][1]=m[i-1][1];
		m[i][2]=m[i-1][2];
		if(s[i]==0) m[i][a[i]]++;
	}
	for(int i=n;i>=1;i--)
	{
		x[i][0]=x[i+1][0];
		x[i][1]=x[i+1][1];
		x[i][2]=x[i+1][2];
		if(s[i]==2) x[i][a[i]]++;
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(s[i]==1)
		{
			for(int j=0;j<=2;j++)
			{
				for(int k=0;k<=2;k++)
				{
					int t=0;
					for(t=0;t<=3;t++)
						if(t!=a[i]&&t!=j&&t!=k) break;
					ans+=t*m[i][j]*x[i][k];
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
 } 

标签:字符,ABC,前缀,308E,cin,int,maxn,后缀,MEX
From: https://www.cnblogs.com/lulu7/p/18229607

相关文章

  • ABC 310 E NAND repeatedly
    题意太懒了,直接给链接吧,题意挺好懂的。https://atcoder.jp/contests/abc310/tasks/abc310_e思路NAND运算,根据题意,我们可以总结出以下两点:当前结果如果遇到1,那么结果反转(0->1,1->0)当前结果如果遇到0,那么结果赋值为1我们手模一下这个样例1:00110(初始)01011(i==1)×0101(i==......
  • ABC 311 C Find it!
    题意给定一个有向图,其中有N个顶点和N条边。保证其中有一个环,请找出这个环并且输出环上的点。思路我们先将图dfs一遍,遍历到的点我们用map进行标记一下,并且储存在一个数组里面,当我们dfs到一个已经标记过的点时,此时则出现了环。那么如何将这个环输出出来呢?我们这个时候扫一遍刚刚......
  • ABC 312 E Tangency of Cuboids
    题意给定三维空间的n个长方体,每个长方体以其一条体对角线的坐标形式给出,即对于每一个长方体i,其一条体对角线的两个端点的坐标会给出。现在对于每一个给出的长方体,求出其它给出的长方体,与其共面的长方体个数。(保证每个长方体两两不相交)思路首先我们第一个关注的应该是坐标的数......
  • ABC 312 F Cans and Openers
    题意现在有三种物品,给出的格式为(t[i],x[i])如下:拉环罐头,被标记为t[i]=0,得到即食,可以得到x[i]的开心值。普通罐头,被标记为t[i]=1,需要用开罐器打开,食用后可以得到x[i]的开心值。开罐器,被标记为t[i]=2,使用后可以打开x[i]个普通罐头。现在有N个这样的物品,你可以选择其中的......
  • ABC 313C Approximate Equalization 2
    题意现在给出一个数组a[n],现在你可以进行这种操作:选择i,j(1<=i,j<=n),使得a[i]=a[i]-1,a[j]=a[j]+1现在你可以进行无限次这种操作,现在需要你求出最少次数,使得数组中的最大值与最小值之间的差不超过1。思路我们考虑到每一次操作可以使得数组中的一个数加一,另一个数减一,那么无......
  • [ABC238E] Range Sums
    原题链接题解把这里的数字看成间隔,不要看成点假设已知能和\(l\)组成区间的端点集合\(A\)和以\(r\)组成区间的端点集合\(B\),这时候加入一个以\(l,r\)为左右端点的区间,那么在加入区间\(l,r\)之后,这两个集合可以合并code#include<bits/stdc++.h>usingnamespacestd......
  • abc356
    D1.5h没做出,E0.5h做出来啦?E有两个做法,第一个是枚举分子来计算分母对答案的贡献,另一种是枚举分母来求分子对答案的贡献。枚举分子来计算分母对答案的贡献需要用到数论分块,所以我们讲枚举分母来求分子对答案的贡献的写法。我们可以直接去枚举这个数是分母的情况。我们先考虑用......
  • ABC 312D题 Count Bracket Sequences
    题意给定一个非空的字符串,其由(,),?三个字符构成,其中?可以被(或者)给替换掉,求替换后的字符串是符合括号匹配的情况下的方案数。最后答案对mod=998244353取模思路应该算是一个板题,一开始的想法是往卡特兰数的方向思考,但是可能是我太水了没想出来,然后一想到卡特兰数的dp求法,就......
  • Atcoder ABC355 C~F
    C出题人太善良了,加强到\(10^5\)都没问题。考虑维护每条横线竖线两条对角线上被标记的点的个数,每次标记点后,判断是否有线上点全被标记。再考虑如何将点编号转为坐标,记编号为\(t\),推柿子:\[(x-1)\timesn+y=t\]\[nx+y=t+n\]\[x=\frac{t+n-y}{n}\]等同于找到\(y\)使得:\[n......
  • ABC 354
    B-AtCoderJanken2本来想开\(\rmvector<pair<string,int>>\)的,但发现其实没有必要,整数部分只需求和即可。另外,多个字符串按字典序升序排序可以直接存\(\rmvector\)后\(\rmsort\)。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmai......