AcWing 1884. COW(前缀和)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 1884. COW(前缀和)相关的知识,希望对你有一定的参考价值。

题目连接

https://www.acwing.com/problem/content/1886/

思路

对于一个COW单词,因为不要求连续,所以我们只需要对C求一个前缀和,W求一个后缀和,然后循环一边,遇到的是一个O的时候我们就将O的前缀和乘上W的后缀和就是我们当前O能组成的所有单词数量

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000009
#define endl "\\n"
#define PII pair<int,int>

int dx[4]=0,-1,0,1,dy[4]=-1,0,1,0;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 2e6+10;
//----------------自定义部分----------------
int n,m,q,a[N],pre[N],later[N];

int main()

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	cin>>n;
	string ch;
	cin>>ch;
	for(int i = 0;i < n; ++i) //记录当前位置以及之前C的数量
		if(ch[i] == 'C')
			pre[i+1] = pre[i] + 1;
		else pre[i+1] = pre[i];
	
	
	for(int i = n-1;i >= 0; --i) //记录当前位置以及之后位置W的数量
		if(ch[i] == 'W')
			later[i+1] = later[i+2] + 1;
		else later[i+1] = later[i+2];
	
	ll ans = 0;
	for(int i = 0;i < n; ++i) 
		if(ch[i] == 'O') ans += pre[i+1] * later[i+1];//遇到一个O我们就把左边的数量乘上右边的数量加在ans上面即可
	
	cout<<ans<<endl;
	return 0;

以上是关于AcWing 1884. COW(前缀和)的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 1884. COW 经典dp

AcWing 1978. 奶牛过马路(前缀和)

AcWing 1913. 公平摄影(前缀和+STL)

Acwing 99 激光炸弹 (二维前缀和)

算法刷题AcWing 99. 激光炸弹——前缀和

AcWing - 513 - 无线网络发射器选址 = 前缀和