题目描述
经典的半杯水问题,告诉了我们乐观的人和悲观的人看到的东西都是不同的。
比如这里有一个字符串”WAC”,乐观的人能看到AC,而悲观的人只觉得自己WA了。
不过可惜的是如果WA单独出现,那么乐观的人也只能看到WA了。
但如果AC单独出现的话,悲观的人也能看到AC了!好耶!
现在有一个长长的字符串。请你数出乐观的人和悲观的人分别看到的AC和WA的数量。
输入
输入只有一行字符串,长度不大于200000,这个字符串只包括W,A,C三种字母,均为大写。
输出
输出两行,每行两个数字由空格隔开。第一行表示乐观的人眼中的WA数量和AC数量,第二行表示悲观的人眼中的WA数量和AC数量。
样例输入
WAWACAC
样例输出
1 2
2 1
解释
思路:
找到原字符串中“WAC” sum1
找到原字符串中“WA” sum2
找到原字符串中“AC” sum3
答案就是
sum2-sum1 sum3
sum2 sum3-sum1
无脑方法
一次遍历,一个一个单词找到WAC,记录数量。
#include<iostream>
#include<string>
using namespace std;
const int N = 200010;
int a1=0,b1=0,a2=0,b2=0;
int main(){
string a;
cin>>a;
int n = a.size();
for(int i=0;i<n-2;i++){
if(a[i]=='W'){
if(a[i+1] == 'A'){
if(a[i+2]=='C'){
a1++;
b2++;
i++;
}
else{
b1++;
b2++;
}
}
}
else if(a[i] == 'A'){
if(a[i+1] == 'C'){
a1++;
a2++;
}
}
}
if(a[n-2] == 'A'){
if(a[n-1] == 'C'){
if(a[n-3] != 'W'){
a1++;
a2++;
}
}
}
else if(a[n-2] == 'W'){
if(a[n-1] == 'A'){
b1++;
b2++;
}
}
cout<<b1<<' '<<a1<<endl;
cout<<b2<<' '<<a2<<endl;
return 0;
}
巧妙方法
用到string的find函数
str.find(sub,index)
sub是子串,index是下标,从那里开始找
如果找到了返回下标,没找到返回一个很大的数,转为整形是int
(代码不是很完美,可以应用index参数)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
cin>>a;
int wacnum=0,wanum=0,acnum=0;
int l=a.length();
for(int i=0;i<l;i++)
{
string b(a,i,l);
int r=b.find("WAC");
if(r!=-1)
{
wacnum++;
i+=r+2;
}
else break;
}
for(int i=0;i<l;i++)
{
string b(a,i,l);
int r=b.find("WA");
if(r!=-1)
{
wanum++;
i+=r+1;
}
else break;
}
for(int i=0;i<l;i++)
{
string b(a,i,l);
int r=b.find("AC");
if(r!=-1)
{
acnum++;
i+=r+1;
}
else break;
}
cout<<wanum-wacnum<<" "<<acnum<<endl;
cout<<wanum<<" "<<acnum-wacnum<<endl;
return 0;
}