class Solution {
public int countSubstrings(String s) {
StringBuilder sb = new StringBuilder("^#");
for (char ch : s.toCharArray()) {
sb.append(ch).append('#');
}
String t = sb.append('$').toString();
int n = t.length();
int[] p = new int[n];
int pos = 0, maxRight = 0;
int ans = 0;
for (int i = 1; i < n - 1; i++) {
p[i] = maxRight > i ? Math.min(maxRight - i, p[2 * pos - i]) : 1;
while (t.charAt(i - p[i]) == t.charAt(i + p[i])) {
p[i]++;
}
if (i + p[i] > maxRight) {
maxRight = i + p[i];
pos = i;
}
ans += p[i] / 2;
}
return ans;
}
}