前缀和与后缀和的预处理

osu!

https://ac.nowcoder.com/acm/contest/24803/F

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int o[100],u[100],s[100];
	memset(o,0,sizeof(o));
	memset(s,0,sizeof(s));
	memset(u,0,sizeof(u));
	int n;
	int cto=0;
	int ctu=0;
	long long sum=0;
	char wr[100];
	scanf("%d",&n);
	scanf("%s",wr);
	for(int ct=0; ct<100; ct++)
	{
		if(wr[ct]=='o')
		{
			cto++;
			o[ct]=cto;
		}
	}              //计数功能没问题 
	
	for(int ctp=99; ctp>0; ctp--)
	{
		if(wr[ctp]=='u')
		{
			ctu++;
			u[ctp]=ctu; 
		}
	}
	int ct3=0;
	int ct4=0;
	int yy=0;
	for(int ct2=0; ct2<100; ct2++)
	{
	    int sumo=0,sumu=0;
		if(wr[ct2]=='s')
		{
			
			ct3=ct2;
			ct4=ct2;
			for(ct3 ; ct3>=0; ct3--)
			{
				if(o[ct3]!=0)
				{
				sumo=o[ct3];
				break;
				
				}
			}
			
			for(ct4 ; ct4<100; ct4++)
			{
				if(u[ct4]!=0)
				{
					sumu=u[ct4];
					break;
				}
			}
			yy=sumo*sumu;
			sum+=yy;
		}
	}
    cout<<sum;
	return 0;
}
链接:https://ac.nowcoder.com/acm/contest/24803/F
来源:牛客网

题目描述

    Let's play osu!
    ht姐姐很喜欢玩osu,她拥有着超凡的指法和无人披靡的手速,当然,还有超高的pp(performance point)。
    某一天大英课上,她偶然发现了一句话中居然出现了"osu"这个子序列,这马上引起了她的注意,于是她决定,在这节课剩下的时间中,找到这段文章中所有子序列"osu"。可是文章实在太长了,请你帮帮她。

*字符串的子序列是从字符串中将若干元素提取出来并不改变相对位置形成的序列。

输入描述:

一行一个整数 nnn (1≤n≤1001 \leq n \leq 1001n100)------表示这段文章由nnn个小写英文字母和下划线组成。
接下来111行为该段文章.

输出描述:

一行一个整数,表示答案。
暴力解法:三重for循环   复杂度0(n的3次方)
正确解法:利用前缀和将每个o前有多少个o维护出来,同立利用后缀和维护w,这样每对一个s进行搜索,只用调取离s最近的o与u即可

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务