题意:给一个含v和o的字符串,两个连续的v可以组成一个w,求该字符串的子串中可以组成wow的子串有多少个
思路:从左到右和从右到左统计w出现的次数,对每一个o,可以组成wow的种数等于左边w数乘以右边w数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
ll l[maxn], r[maxn];
char s[maxn];
int main()
{
while (cin >> s+1) {
ll n = strlen(s+1);
l[0] = 0;
for (int i = 1; i <= n; i++) {
l[i] = l[i-1];
if (i > 1 && s[i] == 'v' && s[i-1] == 'v')
l[i]++;
}
r[n+1] = 0;
for (int i = n; i >= 0; i--) {
r[i] = r[i+1];
if (i < n && s[i] == 'v' && s[i+1] == 'v')
r[i]++;
}
ll res = 0;
for (int i = 1; i <= n; i++) {
if (s[i] == 'o')
res += l[i-1]*r[i+1];
}
cout << res << endl;
}
return 0;
}