CSP-M3

T4 咕咕东学英语

思路:
  • 一开始理解得有偏差,直接计算符合要求的子串,导致复杂度非常高,最后只过了四个点,其余直接T了
  • 考虑到直接计算符合要求的子串比较复杂,那么反过来思考不符合要求的子串。因为子串的总数是确定的。
    • 考虑到字符合法的条件是存在于一个长度大于等于2的回文子串中,而且只有AB两种字符,所以如果一串字符是连续一致的,那么肯定符合要求。关键就在于字符出现变化的边界点上,比如AAABB,那么出现AB时该子串是不符合条件的,而且包括AAB/AAAB/ABB也都是不符合条件的。
    • 因此对于AB/BA这种边界点,我们需要计算它们前后连续字符的数量,即意味着不符合要求的子串的数量。注意再次出现边界时便会产生回文子串,所以每次计算的起点/终点便是一个个边界点。
实现:
#include
#include

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	string str;
	long long n;
	cin >> n >> str;
	long long cnt=1,ans = n*(n-1)/2;
	
 	for(long long i=1;i<n;i++)
    {
        if(str[i]==str[i-1])cnt++;
        else 
		{
        	ans-=cnt;
			cnt=1;	
		}
    }
    
    cnt=1;
    for(long long i=n-2;i>=0;i--)
    {
        if(str[i]==str[i+1])cnt++;
        else 
        {
        	ans-=cnt;
			cnt=1;	
		}		
    }
    
    for(long long i=1;i<n;i++)
        if(str[i]!=str[i-1])ans++;
	cout << ans;
	return 0;
}

你可能感兴趣的:(程序设计思维与实践)