回文自动机

写一篇文章来详解一下回文自动机吧,之前没弄懂吃了大亏。

#include
using namespace std;

const int maxn = 5e5;
const int sigma_size = 26;

struct Palindromic_Tree{
    int ch[maxn][sigma_size];//next数组
    int f[maxn];//表示失配指针,具体来说就是与当前点有相同后缀(最长)最近的位置
    int cnt[maxn];//表示当前节点前的那一个回文串在整个数组中总共出现了几次(调用count后)
    int num[maxn];//以当前节点结尾的回文串的种类数
    int len[maxn];//以当前节点为结尾的回文串的最长长度
    int s[maxn];//储存字符
    int last;
    int n;
    int p;

    int newnode(int w){
        for(int i=0;i=0;i--){
            cnt[f[i]]+=cnt[i];//统计每个节点对应的某种回文串出现的次数
        }
    }
}solver;

char str[maxn];
int main(){
    solver.init();
    scanf("%s",str);
    int len = strlen(str);
    long long ans = 0;
    for(int i=0;i

你可能感兴趣的:(回文自动机)