大致题意:给你一个字符串,问这个字符串的子串中,有多少个本质不同的回文串恰好是另外一个回文串的子串,求这样的回文串的对数。
可以说,这是一个回文树/回文自动机的裸题吧。显然,在回文树里面,一个节点的所有后代都是回文串而且包含当前回文串,所以可以直接统计所有节点的size。然后,当前节点的所有后代也包含当前节点的fail回文串,所以后代的贡献也要算到fail上。那么,一个很显然的问题就是,为什么后代的贡献不用给当前点fail的fail呢?因为根据回文树的性质,当前点一定是其fail的fail的后代,所以不用重复统计。因此,我们建立回文树,然后遍历回文树,每到一个点看当前点和其fail是否被标记。如果被两个都没被标记,那么贡献就是2,有一个被标记那么贡献为1,否则为0。然后再打上标记,当遍历完这个点的子树之后,再去掉当前点的标记。最后,用每个点的贡献乘以size即可。具体见代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define eps 1e