- 穷举算法——奶牛碑文(cow)
题目描述
小伟暑假期间到大草原漫游,在一块石头上发现了一些有趣的碑文。碑文似乎是一个神秘古老的语言,只包括三个大写字母 C、O 和W。
尽管小伟看不懂,但是令他高兴的是,C、O、W的顺序形式构成了一句他最喜欢的奶牛单词“COW”。现在,他想知道有多少次 COW出现在文本中。
如果 COW 内穿插了其他字符,只要 COW 字符出现在正确的顺序,小伟也不介意。甚至,他也不介意出现不同的 COW 共享一些字母。
例如,CWOW 出现了 1 次 COW,CCOW 算出现了2 次 COW,CCOOWW 算出现了 8 次 COW。
输入
第 1 行为 1 个整数 N。
第 2 行为 N 个字符的字符串,每个字符是一个 C、O 或 W
输出
输出 COW 作为输入字符串的字串出现的次数(不一定是连续的)。
提示:答案会很大,建议用 64 位整数(long long)。
样例输入
6
COOWWW
样例输出
6
查找三个顺序字母组合成的COW,其实只要找到中间的那个O,记录前后C和W的个数就行,错了几次主要是数组开得太小了,改大一点就ac了,上代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<string>
using namespace std;
main()
{
string inputStr;
long long inputNum,num,cNum[100010],wNum[100010],ans=0,mebC,mebW;
cin>>inputNum;
cin>>inputStr;
mebC=mebW= 0; //C从前往后,W从后往前记录个数,碰到O记录当前O前后C和W的个数
for(int i=0,j=inputNum-1; i<inputNum,j>=0;i++,j--){
if(inputStr[i]=='C'){
mebC++;
}
if(inputStr[i]=='O'){
cNum[i] = mebC;
}
if(inputStr[j] == 'W'){
mebW++;
}
if(inputStr[j]=='O'){
wNum[j] = mebW;
}
}
for(int i=0; i<inputNum; i++){
if(inputStr[i]=='O'){
ans += (wNum[i]*cNum[i]);//个数相乘即是当前O能组合成COW的个数
}
}
cout<<ans<<endl;
}
第一次写博客,,有不对或者更好地方法还请指教