2019 Xuzhou juego de red G. cadena colorida [] árbol palíndromo

portal

El significado de los problemas

Varios definición diferente de una cadena de caracteres de la cadena de valor, una cadena de todos los valores subcadenas palindrómicas que buscan.

solución del problema

Palíndromo bordo autómata examinó la cuestión, pero por desgracia el tiempo no lo hizo antes de la escuela, construida árbol directamente palíndromo, el DFS estadísticas sobre la línea.
Con el fin de escribir esto es casi perfecto palíndromo plantilla de máquina automática, plantillas antes de escribir que no funciona bien.

código

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N=3e5+10;
char s[N];
int n;
LL ans;
struct PAM{
    int tr[N][26],fail[N],len[N],cnt[N],tot,last,n;
    int getfail(int x){
        while(s[n]!=s[n-len[x]-1]) x=fail[x];
        return x;
    }
    void init(char *s){
        n=tot=last=0;
        cnt[0]=len[0]=cnt[1]=0;
        memset(tr[0],0,sizeof(tr[0]));
        memset(tr[1],0,sizeof(tr[1]));
        fail[0]=1;
        len[++tot]=-1;
        for(n=1;s[n]!='\0';n++){
            int c=s[n]-'a',cur=getfail(last);
            if(!tr[cur][c]){
                len[++tot]=len[cur]+2;cnt[tot]=0;
                memset(tr[tot],0,sizeof(tr[tot]));
                fail[tot]=tr[getfail(fail[cur])][c];
                tr[cur][c]=tot;
            }
            last=tr[cur][c];
            cnt[last]++;
        }
        for(int i=tot;i>=0;i--) cnt[fail[i]]+=cnt[i];
    }
    int count,vis[26];
    void dfs(int u){
        ans+=count*cnt[u];
        for(int i=0;i<26;i++){
            if(!tr[u][i]) continue;
            vis[i]++;if(vis[i]==1) count++;
            dfs(tr[u][i]);
            vis[i]--;if(!vis[i]) count--;
        }
    }
}pam;


int main(){
    scanf("%s",s+1);
    pam.init(s);
    pam.dfs(0);
    pam.dfs(1);
    cout<<ans<<endl;
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/BakaCirno/p/12529732.html
Recomendado
Clasificación