题目:
题解:
这种二分题目主要考虑单调性,
O(nlogn)
还是资瓷的
我们可以枚举对称的中心,然后二分长度加到一起,如果小的都不能对称,那更大的肯定不能对称
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#define ull unsigned long long
using namespace std;
const int N=5e5;
const int p=1300000001ull;
char st[N+5];
ull H1[N+5],H2[N+5],mi[N+5];
bool check(int l,int r,int mid)
{
ull x=H1[r]-H1[l-1]*mi[r-l+1];
ull y=H2[l]-H2[r+1]*mi[r-l+1];
if (x==y) return 1;else return 0;
}
int main()
{
int n,i,ans=0;
scanf("%d",&n);scanf("%s",st+1);
mi[0]=1;
for (i=1;i<=n;i++) mi[i]=mi[i-1]*p;
for (i=1;i<=n;i++)
H1[i]=H1[i-1]*p+st[i]-'0';
for (i=n;i>=1;i--)
H2[i]=H2[i+1]*p+(!(st[i]-'0'));
for (i=1;i<=n;i++)
{
int l=1,r=min(i,n-i),cnt=0;
while (l<=r)
{
int mid=(l+r)>>1;
if (check(i-mid+1,i+mid,mid)) cnt=mid,l=mid+1;
else r=mid-1;
}
ans+=cnt;
}
printf("%d",ans);
}