Ocean的游戏

 B: Ocean的游戏

时间限制: 1 s      内存限制: 128 MB     

提交 我的状态

题目描述

给定一个字符串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”,请输出偏序对的个数。

输入

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

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

输出

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

样例输入

15
oooccceeeaaannn

样例输出

243

代码:

#include <iostream>
#include <list>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int maxn=1e5+10;
char s[maxn];
int dp[5][maxn];

int main()
{


    int n;
    while(scanf("%d",&n)!=EOF)
    {
        getchar();
        scanf("%s",s);
        memset(dp,0,sizeof(dp));
        //dp[o][i]代表i前面有多少‘o‘
        //dp[e][i]代表i前面有多少个”oce“
        for(int i=0;i<n;i++)
        {
            if(i!=0)
            {
                for(int k=0;k<5;k++)
                    dp[k][i]=dp[k][i-1];

            }

            if(s[i]=='o')
            {
                dp[0][i]++;
            }
            else if(s[i]=='c')
            {
                dp[1][i]=(dp[1][i]+dp[0][i])%mod;
            }
            else if(s[i]=='e')
            {
                dp[2][i]=(dp[2][i]+dp[1][i])%mod;
            }
            else if(s[i]=='a')
            {
                dp[3][i]=(dp[3][i]+dp[2][i])%mod;
            }
            else if(s[i]=='n')
            {
                dp[4][i]=(dp[4][i]+dp[3][i])%mod;
            }

        }
        printf("%d\n",dp[4][n-1]);
    }

     return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42373330/article/details/82817010