题目描述
23世纪的一天,甬江边出现了白鹭外的一种新品种,雄鸟非常爱惜雌鸟,所以它们采用一种集体一字型飞行方式,用A代表雌鸟,B代表雄鸟,他们总是排成A,ABA,ABABA,ABABABA,ABABABABABA……的形式,这些一起飞的鸟称为一个飞行单元,但在某一天,你看到了天上上百万只鸟一字型飞过,那么请你数数,这里有多少个飞行单元呢?
输入要求
只有一组,代表你看到的鸟的排列,注意,一个飞行单元中不会找到别的飞行单元中的鸟。
即一只鸟只属于一个飞行单元,飞行单元也是一个一个排列的 。鸟的数目不超过10000000
输出要求
输出飞行单元的数目
输入样例
AABABABABABAABAABABA
输出样例
4
知识点
统计字符串中符合某种规律的子串
关键点
仔细观察题目中A,ABA,ABABA,ABABABA,ABABABABABA…的飞行单元,
我们发现这些单元(串)的第一个字符和最后一个字符都是字符A,中间字符B和字符A交替出现。
我们可以划分出几个状态,tp=0代表当前字符要么为鸟排列的第一个字符,之前还没有任何字符,要么代表之前字符串不再有可与当前字符相联系的字符A,但再前面一个字符也是B。tp=1代表当前字符前一个字符是A。tp=2代表当前字符前一个字符是B,再前面一个字符也是B。
注意点
鸟排列的最后一个字符串需要在循环外特殊处理
源码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char a[10000005];
int main()
{
int len,i,tp=0; //tp为状态变量,不同的tp值反映了每个字符相邻前一个字符的不同
int sum=0;
gets(a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]=='A')
{
if(tp==0) tp=1;
else if(tp==1) {sum++;tp=1; }
else tp=1;
}
else
{
if(tp==0) tp=0;
else if(tp==1) tp=2;
else {sum++;tp=0;}
}
}
if((a[len-1]=='A'&&tp==1)||(a[len-1]=='B'&&tp==2)) sum++;
printf("%d\n",sum);
return 0;
}