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;
}