NBUOJ 1969 统计元字串数目(字符串处理)

题目描述

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值