我看了题解,只有当连续只有1头牛时,题解只考虑了这头牛在中间的情况和在一边的情况,实际上,这头牛可以在最左边,也可以在最右边。
#include<bits/stdc++.h>
using namespace std;
int n,a[500005],cnt=1,k=0;
long long ans=0;
string s;
char c;
int main(){
cin>>n>>s;
s=s+'2'; //方便处理最后一个字符
for(int i=0;i<n;i++) {
//统计连续的相同牛的数量,这样每个数两边的数就是另一种牛的数量
if(s[i]==s[i+1]) cnt++;
else{
a[++k]=cnt;
cnt=1;
}
}
ans=a[2]-1; //头单独处理
for(int i=2;i<k;i++){
//当前牛在最左或最右时
ans+=a[i-1]+a[i+1]-2;
//当前只有1个,牛在中间,可以两边同时选
if(a[i]==1) ans+=a[i-1]*a[i+1];
}
ans+=a[k-1]-1; //尾单独处理
cout<<ans;
return 0;
}