Educational Codeforces Round 74 (Rated for Div. 2) D. AB-string(思维+规律)

题目链接
在这里插入图片描述
在这里插入图片描述
思路:由于给出的字母只要a和b,所有其实比较容易观察,一眼看回文数量不好求,我们可以转个变,求出不是回文的数量,然后总数减去它就是答案,那么怎么求不是回文的字串数量呢?打个表可以观察一下,一般包含,ABBB,BBBA,BAAA,AAAB的都不是回文串,每次遇到A的时候往前和往后扫相同的B字符数,遇到B的时候也是同理。不过这里有个思维漏洞需要注意一下,就是出现ABAB的时候会减重复了,这个部分要注意一下。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+1; 
char s[maxn];
ll n,ans,cnt;
int main()
{
	scanf("%lld",&n);
	scanf("%s",s);
	for(int i=0;i<n;++i)
	{
		if(s[i]=='B')
		{
			for(int j=i-1;j>=0;--j) 
			if(s[j]=='A') ans++;
			else break;
			for(int j=i+1;j<n;++j)
			if(s[j]=='A') ans++;
			else break;
		}
		if(s[i]=='A')
		{
			for(int j=i-1;j>=0;--j) 
			if(s[j]=='B') ans++;
			else break;
			for(int j=i+1;j<n;++j)
			if(s[j]=='B') ans++;
			else break;
		}
	}
	for(int i=1;i<n;++i) if(s[i]!=s[i-1]) cnt++;
	ans-=cnt;
	cout<<n*(n-1)/2-ans<<endl; 
}
发布了144 篇原创文章 · 获赞 0 · 访问量 4962

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104434631