hdu1544

/*
分析:
  摘:
    一般方法其实面对abcdefg这种的效率还是可以接受的因为一旦
不匹配就跳出,但是碰到aaaaaaa这种的就是十足的O(n2)了,再加上
判断回文,最坏会达到O(n3)面对1544这样5000的数据量肯定会超
时,但是经过缩距之后就能非常高效的处理这个数据,何为缩距,就
如aaaaaaabbbaaacc可以缩距成abac然后打个Hash表记录第i个字符有
多少个。


                                                  2012-04-24
*/






#include"stdio.h"
#include"string.h"
int main()
{
	int hash[5555],k;
	char temp[5555];
	char str[5555];
	int i;
	int count;
	int a,b;
	int flag;


	while(scanf("%s",temp)!=-1)
	{
		k=0;
		memset(hash,0,sizeof(hash));
		hash[0]=1;
		str[0]=temp[0];
		///压缩
		for(i=1;temp[i];i++)               //k表示最后面的元素的下标。
		{
			if(temp[i]==temp[i-1])
			{
				hash[k]++;
			}
			else
			{
				k++;
				hash[k]=1;
				str[k]=temp[i];
			}
		}
		k++;                               //k表示总元素数。


		count=0;
		for(i=0;i<k;i++)
		{
			count+=(1+hash[i])*hash[i]/2;  //包含自身所有情况。
		}
		for(i=0;i<k;i++)
		{
			a=i-1;
			b=i+1;
			if(a<0||b>k-1)
				continue;
			flag=0;
			while(str[a]==str[b]&&hash[a]==hash[b])
			{
				count+=hash[a];
				a--;
				b++;
				if(a<0||b>k-1)
				{
					flag=1;
					break;
				}
			}
			if(flag==0&&str[a]==str[b])
			{
				count+=hash[a]>hash[b]?hash[b]:hash[a];
			}
		}


		printf("%d\n",count);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值