1 /*
2 我们发现回文串是可以二分的
3 比如:bbbabcbaabcba 我们以第1个c为
4 中心,发现回文半径是3,大于3一定不是回文串。当回文串长度为偶数的时候
5 我们需要特殊处理一下。
6 现在有一个结论:本质不同的回文串个数只有O(N)个
7 本质不同:字符串本身是不同的。
8 每一次处理完回文串,我们要把他的hash值记录下来。
9 */
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13 #include <map>
14 using namespace std;
15
16 typedef unsigned long long ULL;
17 typedef long long LL;
18
19 char s[10005];
20 ULL h[10005],rh[10005],pw[10005];
21 int L;
22
23 ULL hs(int l,int r){
24 return h[r]-h[l-1]*pw[r-l+1];
25 }
26
27 ULL rhs(int l,int r){
28 return rh[l] - rh[r+1]*pw[r-l+1];
29 }
30
31 struct N{
32 int a[26];
33 bool ok(){
34 int b[26];
35 for(int i=0;i<26;i++) b[i]=a[i];
36 sort(b,b+26);
37 for(int i=0;i<25;i++){
38 if(b[i]>0&& b[i] == b[i+1]) return true;
39 }
40 return false;
41 }
42 void clear(){
43 memset(a,0,sizeof a);
44 }
45 };
46
47 LL ans=0;
48 map<ULL,LL> num;
49 map<ULL,N> A;
50 void solve_odd(){
51 for(int i=1;i<=L;i++){
52 int l = 1,r = min(i,L-i+1)+1;
53 while(r-l>1){
54 int mid = (l+r)/2;
55 if(hs(i-mid+1,i+mid-1)== rhs(i-mid+1,i+mid-1)) l=mid;
56 else r=mid;
57 }
58 int p=l;
59 int tmp = p;
60 while(tmp>=1&&num.find(hs(i-tmp+1,i+tmp-1))==num.end()) tmp--;
61 LL sum = 0;
62 N st;
63 st.clear();
64 if(tmp>=1){
65 sum=num[hs(i-tmp+1,i+tmp-1)];
66 st = A[hs(i-tmp+1,i+tmp-1)];
67 }
68 while(tmp<p){
69 st.a[s[i+tmp]-'a']+= (tmp == 0?1:2);
70 if(st.ok()) sum++;
71 num[hs(i-tmp,i+tmp)] = sum;
72 A[hs(i-tmp,i+tmp)] = st;
73 tmp++;
74 }
75 ans+=sum;
76 }
77 }
78
79 void solve_even() {
80 A.clear();
81 num.clear();
82 for(int i=1;i<L;i++){
83 int l = 1,r = min(i,L-i)+1;
84 while(r-l>1){
85 int mid = (l+r)/2;
86 if(hs(i-mid+1,i+mid)== rhs(i-mid+1,i+mid)) l=mid;
87 else r=mid;
88 }
89 int p=l;
90 int tmp = p;
91 while(tmp>=1&&num.find(hs(i-tmp+1,i+tmp))==num.end()) tmp--;
92 LL sum = 0;
93 N st;
94 st.clear();
95 if(tmp>=1){
96 sum=num[hs(i-tmp+1,i+tmp)];
97 st = A[hs(i-tmp+1,i+tmp)];
98 }
99 while(tmp<p){
100 st.a[s[i+tmp+1]-'a']+= 2;
101 if(st.ok()) sum++;
102 num[hs(i-tmp,i+tmp+1)] = sum;
103 A[hs(i-tmp,i+tmp+1)] = st;
104 tmp++;
105 }
106 ans+=sum;
107 }
108 }
109
110 int main(){
111 freopen("str.in","r",stdin);
112 freopen("str.out","w",stdout);
113 scanf("%s",s+1);
114 L=strlen(s+1);
115 s[0]='#';
116 pw[0]=1;
117 for(int i=1;i<=L;i++) pw[i] = pw[i-1]*13131 ;
118 for(int i=1;i<=L;i++) h[i] = h[i-1]*13131 + s[i];
119 for(int i=L;i>=1;i--) rh[i] = rh[i+1]*13131 + s[i];
120 solve_odd();
121 solve_even();
122 printf("%lld
",ans);
123 fclose(stdout);
124 return 0;
125 }