找到字符串中共有多少个回文串,ans+map[i]/2就是最终答案了,模板题~
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[111000];
char ma[222000];
ll mp[222000];
ll ans=0;
ll manacher(ll len)
{
ll l=0;
ma[l++]='$';
ma[l++]='#';
for(ll i=0;i<len;i++)
{
ma[l++]=s[i];
ma[l++]='#';
}
ma[l]=0;
ll id=0,right=0;
ans=0;
for(ll i=1;i<l;i++)
{
mp[i]=i<right?min(mp[2*id-i],right-i):1;
while(ma[i+mp[i]]==ma[i-mp[i]])
{
//ans++;
mp[i]++;
}
if(i+mp[i]>right)
{
id=i;
right=mp[i]+i;
}
ans=ans+mp[i]/2;
}
return ans;
}
int main()
{
while(~scanf("%s",s))
{
ans=0;
memset(mp,0,sizeof(mp));
memset(ma,'\0',sizeof(ma));
ll x=strlen(s);
printf("%lld\n",manacher(x));
}
return 0;
}