简单题意, 找两个字符串, A B,
A, B 都是回文串, A 是 B 的子串,
A 和 B 的位置任意,可以相同,
f[x] 为 A 的长度为 x , 的 A B 的对数.
根据回文树的性质,
如果A 是B 的子串,
那么一定会有一条路径, B 找它的父亲,然后直接 fail 指向 A.
所以我们只要考虑, A 的子树, fail 指针指向 A 的那些节点的子树.
有可能有多个节点的fail 指向同一个 节点,
多个节点有可能会算重复,这个就需要我们判断重复了.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+100;
char s[N];
int n,base,mod;
long long f[N];
namespace PAM {
int sz, fl[N], len[N], ch[N][26],cnt[N],vis[N],l[N];
char *s;
int find(int x, int y) {
return s[y] == s[y - len[x] - 1] ? x : find(fl[x], y);
}
void cal(char *str) {
s = str;
int n = strlen(s + 1);
for (int i = 0; i <= n + 2; ++i){
fl[i] = cnt[i] = 0;
for (int j = 0; j < 26; ++j)
ch[i][j] = 0;