题目大意:
求一个串中有多少个回文子串
这.....
妥妥的模板题吧....
对所有的$r[i] / 2$进行求和即可,其中,$r[i]$为以$i$为中心的回文半径
$r[i] / 2$怎么来的,画下图就知道了...
复杂度$O(n)$
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define ri register int #define rep(io, st, ed) for(ri io = st; io <= ed; io ++) const int sid = 4005; int n, m, ans; char s[sid], t[sid]; int r[sid]; int main() { scanf("%s", s + 1); n = strlen(s + 1); rep(i, 1, n) { t[++ m] = '#'; t[++ m] = s[i]; } t[++ m] = '#'; r[1] = 1; int mr = 1, pos = 1; rep(i, 2, m) { r[i] = min(mr - i + 1, r[pos + pos - i]); while(i > r[i] && t[i + r[i]] == t[i - r[i]]) r[i] ++; if(i + r[i] - 1 > mr) mr = i + r[i] - 1, pos = i; } rep(i, 1, m) ans += r[i] / 2; printf("%d ", ans); return 0; }