题目描述:

给定一个只包含两种字符的字符串s,如果s的一个子串中不存在两个相邻的字符相同的情况,则认为这是一个交替子字符串。 需要注意的是,两个子串起始位置不同,终止位置不同,则认为他们是不同的子串。 求字符串s的交替子字符串的个数。

输入

从文件 alternate.in 中读入数据。 一行,一个字符串 s,仅包含两种字符。

输出

输出到文件 alternate.out 中一个整数, 表示字符串s的交替子字符串的个数。

输入样例

abbb

输出样例

5

大家通过读题,不一定能看明白,说的是个什么,这时候可以看一下题目给出的样例解释

样例解释

abbb共有“a",”ab","b",”b",”b"五种不同的交替子串 abbb字符串的子串包含有,’a’,’b’,’b’,’b’,’ab’,’bb’,’bb’,’abb’,’bbb’,’abbb’;其中符合题目描述的 “两个子串起始位置不同,终止位置不同,则认为他们是不同的子串”。 “a",”ab","b",”b",”b"

组委会给出的参考 1

#include <bits/stdc++.h>  
using namespace std;  
int cnt;
int main()
{
    //freopen("alternate.in","r",stdin);
    //freopen("alternate.out","w",stdout);
    string s;
    cin>>s;
    int fg=0; 
    for(int i=0;i<s.size();i++)//从尾部开始 
    {
        for(int j=0;j<=i;j++)//从头部开始
        {
            fg=0;
            for(int k=j;k<=i-1;k++) 
            {   
                //判断是否交替,头尾两个位置相等的话,就不是,跳过 
                if(s[k]==s[k+1])
                {
                    fg=1;
                    break;  
                } 
            }
            if(fg==0)
                cnt++;
         } 
    }
    cout<<cnt;
    return 0; 
}

组委会给出的参考 2

#include <bits/stdc++.h>  
using namespace std;  
  
int main()
{
//  freopen("alternate.in","r",stdin);
//  freopen("alternate.out","w",stdout);
    string s;
    cin>>s;
    long long num=1,t=1;
    //遍历字符串 
    for(int i=t;i<s.size();i++)
    {
    	//判断相邻位置是否相同 
        if(s[i-1]==s[i])
        {
        	//相等时,子串自身加 1 ,总数加 1 
            num++;
            t=1;//遍历的起始位置从1开始 代入样例来理解 
        }
        else
        {
            t++;
            num+=t; 
        } 
    } 
    cout<<num;
    return 0;
}

参考 3

#include <bits/stdc++.h>  
using namespace std;  
long long ans=1;
int main()
{
	//freopen("alternate.in","r",stdin);
	//freopen("alternate.out","w",stdout);
	string s;
	cin>>s; 
	for(int i=1,j=0;i<s.size();i++)
	{
		//当前位置和上一位置的字串相同时
		//移动j的位置(头部) 
		if(s[i] == s[i-1])
			j=i;
		ans +=i-j+1;
	}
	cout<<ans;
	return 0; 
 }