#include
#include
/*
描述
现在给你一个字符串S,请你计算S中有多少连续子串是回文串。倘若不懂“回文字串”请自行谷歌了解啦!
输入
输入包含多组测试数据。每组输入是一个非空字符串,长度不超过5000。
输出
对于每组输入,输出回文子串的个数。
比如:输入aa则输出3
*/
int main(int argc, char* argv[])
{
char s[5000];
int p, i, Half, Left, Right, Count;
while( gets(s) )
{
i = strlen(s);//如果用sizeof则初始值是5000
Count=i;
//以最后一个为基准点向前衍生
for(p=0; p<=i-1; p++)
{
Half = ((i-1)-p) / 2;
//如果子串是奇数个
if( ((i-1)-p)%2 == 0 )
{
Left = p + Half - 1;
Right = p + Half + 1;
}
else //如果子串是偶数个
{
Left = p + Half;
Right = p + Half + 1;
}
while( Left >= p )
{
if( s[Left] == s[Right])
{
Count++;
Left--;
Right++;
}
else //不相等,不可能是回文字串,终止向外扩展
{
break;
}
}
}
//以第一个为基准点向后衍生至都数第二个
for(p=i-2; p>=1; p--)
{
Half = p / 2;
//如果子串是奇数个
if( p%2 == 0 )
{
Left = Half - 1;
Right = Half + 1;
}
else //如果子串是偶数个
{
Left = Half;
Right = Half + 1;
}
while( Left >= 0 )
{
if( s[Left] == s[Right] )
{
Count++;
Left--;
Right++;
}
else
{
break;
}
}
}
printf("%d\n",Count);
}
return 0;
}