• Source
    1. /**************************************************************
    2.   Problem: 2084
    3.   User: zrts
    4.   Language: C++
    5.   Result: Accepted
    6.   Time:12 ms
    7.   Memory:3248 kb
    8. ****************************************************************/
    9.  
    10. #include<cstdio>
    11. using namespace std;
    12. int n;
    13. char a[500005];
    14. int r[500005];
    15. long long ans;
    16. inline int max(int a,int b){
    17. if(a>b) return a;
    18. return b;
    19. }
    20. inline int min(int a,int b){
    21. if(a<b) return a;
    22. return b;
    23. }
    24. int main(){
    25. scanf("%d%s",&n,a);
    26. int i(0),j(0),lim=n-1,k;
    27. for(;i<lim;){
    28. while(i-j>=0&&i+j+1<n&&a[i-j]!=a[i+j+1]) j++;
    29. ans+=(r[i]=j);
    30. k=1;
    31. while(i>=k&&k<=j&&r[i-k]<j-k){
    32. ans+=(r[i+k]=min(r[i-k],j-k));
    33. k++;
    34. }
    35. j=max(j-k,0);i+=k;
    36. }
    37. printf("%lld\n",ans);
    38. return 0;
    39. }