codeforces ECR 74 AB-string(找规律)

题目大意:

有一字符串,我们定义好的字符串为:它的每一个字符都可以找到那个字符所在的子串的回文串。现在问这个字符串有多少个好的字符串。

解题思路:

首先,我们考虑事件的对立事件。有多少坏的字符串。我们发现一个字符串是坏的,当且仅当出现一个坏的字符在某个串的左右端点。为什么呢?考虑一个字符串,它中间的字符只可能有两种情况。首先:str[i] == str[i-1] || str[i]== str[i+1],那么这个字符串肯定是好的字符串,其次str[i]!=str[i-1] && str[i]!=str[i+1],那么它也可以生成一个回文串例如ABA,BAB。所以出现坏字符串当且仅当出现:

ABBBBB

BBBBBA

BAAAAA

AAAAAB

所以我们找出来即可。

废话:这题首先我们要想到找事件的对立事件。

#include <bits/stdc++.h>
#define OPEN 0
#define int long long
using namespace std;
int32_t main() {
#if OPEN
	freopen("in.txt", "r", stdin);
#endif
	int n; cin >> n;
	string str; cin >> str;
	int ans = 0;
	for (int ii = 0; ii<2; ii++) {
		reverse(str.begin(), str.end());
		int i = 0; int j = 0;
		while (str[j] == str[i] && j<n) {
			j++;
		}
		for (i = j - 1; i<n; i = j - 1) {
			j = i + 1;
			if (j == n)break;
			while (j<n&&str[j] != str[i]) {
				ans++;
				j++;
			}
			if (ii == 1)ans--;
		}
	}
	ans = n*(n - 1) / 2 - ans;
	cout << ans << endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值