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