思路:
首先先把两个连续的 v \texttt{v} v 合并成一个 w \texttt{w} w。
接着就计算 w \texttt{w} w 的数量, wo \texttt{wo} wo 的数量,最后是 wow \texttt{wow} wow 的数量。
注意计算 wow \texttt{wow} wow 数量的时候 需要判断此 w \texttt{w } w 是否在至少一个 o \texttt{o} o 之后。
其实只需要判断此 w \texttt{w} w 是否在 第一个 出现的 o \texttt{o} o 之后。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
const int M=2023;
const int inf=0x3f3f3f3f;
char a[N];
ll w,wo,wow;
ll flag=inf,len;
int main()
{
scanf("%s",a);
len=strlen(a);
for(ll i=0;i<len;i++)
{
if(a[i]=='o')
{
flag=min(flag,i);
}
if(a[i]=='v' and a[i+1]=='v')
{
a[i]='w';//把两个连续的v合并成一个w
}
}
for(int i=0;i<len;i++)
{
if(a[i]=='w')
{
w++;
if(wo and i>flag)//必须要在至少一个o之后
{
wow+=wo;
}
}
if(a[i]=='o')
{
if(w)
{
wo+=w;
}
}
}
printf("%lld",wow);
return 0;
}