B: Ocean的游戏(前缀和)

B: Ocean的游戏
Time Limit: 1 s      Memory Limit: 128 MB
Submit My Status
Problem Description
给定一个字符串s,保证只包含小写的’o’,’c’,’e’,’a’,’n’。是否存在这样的偏序对<a,b,I,j,k>使得a<b<i<j<k 并且s[a]+s[b]+s[i]+s[j]+s[k]=”ocean”,请输出偏序对的个数。

Input
第一行输入一个整数n(1≤n≤105)n(1≤n≤105);

第二行输入一个长度为nn的字符串ss。

Output
输出一个整数(这个数可能十分大,对109+7109+7取模)

Sample Input
15
oooccceeeaaannn
Sample Output
243

#include<iostream>
#include<string.h>
#include<algorithm>
#define inf 1000000007
#define ll long long
using namespace std;
ll nn,num[111111][5];
char s[111111],p[5]={'o','c','e','a','n'};
int main()
{
    scanf("%lld",&nn);
    cin>>s;
    ll o=0,oc=0;
    for(int j=0;j<nn;j++)
    {
        if(s[j]==p[0])//出现o
            o++;
        num[j][0]=o;//记录o的个数
        if(s[j]==p[1])//出现c,找oc个数
            oc+=num[j][0]%inf;//oc个数=前面oc个数+前面o的个数
        num[j][1]=oc%inf;//cout<<num[j][1];
    }
    ll n=0,an=0;
    for(int j=nn-1;j>=0;j--)
    {
        if(s[j]==p[4])
            n++;
        num[j][4]=n;//cout<<c;
        if(s[j]==p[3])
            an+=num[j][4]%inf;
        num[j][3]=an%inf;//cout<<num[j][3];
    }
    ll sum=0;
    for(int i=0;i<nn;i++)
    {
        if(s[i]=='e')
            sum+=(num[i][1]*num[i][3])%inf;
    }
    printf("%lld\n",sum%inf);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42060896/article/details/81675137