洛谷 P2646 数数zzy

题目描述

zzy自从数学考试连续跪掉之后,上数学课就从来不认真听了(事实上他以前也不认真听)。于是他开始在草稿纸上写写画画,比如写一串奇怪的字符串。然后他决定理♂性♂愉♂悦♂一下:统计这串字符串当中共有多少个为“zzy”的子序列(注意是子序列而非子串)。但是由于他写的字符串实在是太长啦,而且他是个超级大蒟蒻,根本就数不过来。所以他决定请求你这个超级大神犇的帮助。你可以帮帮他吗?

输入输出格式

输入格式:

 

一行仅含小写字母的字符串。

 

输出格式:

 

一行,一个非负整数,表示输入的字符串中为“zzy”的子序列的个数。

 

输入输出样例

输入样例#1: 复制
zlzhy
输出样例#1: 复制
1

说明

70%的数据满足:1<=n<=100。

100%的数据满足:1<=n<=1000000。

n表示字符串的长度

数据保证答案不超过2^63-1

思路:数学

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char s[1000010];
long long sum[1000010];
long long ans,len,num;
int main(){
    scanf("%s",s);
    len=strlen(s);
    for(int i=1;i<=1000000;i++)    sum[i]=sum[i-1]+i;
    for(int i=0;i<len;i++){
        if(s[i]=='z')    num++;
        if(s[i]=='y')    ans+=sum[num-1];
    }
    cout<<ans;
}

 

posted @ 2017-11-22 20:55  一蓑烟雨任生平  阅读(236)  评论(0编辑  收藏  举报