题目链接


\(Description\)

给定一棵\(Trie\)。求\(Trie\)上所有回文串 长度乘以出现次数 的和。这里的回文串只能是从上到下的一条链。

节点数\(n\leq 2\times 10^6\),字符集为a,b,c,d

\(Solution\)

如果不是树,就是回文树模板。对于树,DFS \(x\)的每个儿子的时候都用在\(x\)处的\(las\)即可,也就是按深度存一个\(las\)数组,每次用\(las[dep-1]\)做\(las\)去插入即可。(也可以回溯的时候直接删节点)

每次插入产生的贡献怎么算。。?

令\(ans[x]\)表示\(x\)节点(状态)处的贡献,插入后到了\(x\)节点答案就加上\(ans[x]\)。

对于新建的\(x\)节点,\(ans[x]=len[x]+ans[fail[x]]\)(除了新产生的串,剩下的贡献就是\(fail[x]\)的状态的贡献了)。

加了fread之后惊呆了= =拿到了hdu上第一个rank1= =

果然不是我算法效率问题。。。



话说我为什么不需要开栈啊


//1092MS	151236K(fread) <- 7784MS	149280K
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 2000000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=2e6+6; char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
} struct PAM
{
int s[N],H[N],nxt[N],tot,las[N],son[N][4],len[N],fail[N];
LL Ans,ans[N];
char tmp[N];
inline void Init()
{
las[0]=tot=1, fail[0]=1, len[1]=-1, s[0]=-1;
memset(son[0],0,sizeof son[0]), memset(son[1],0,sizeof son[1]);
}
inline int Find(int x,int n)
{
while(s[n]!=s[n-len[x]-1]) x=fail[x];
return x;
}
void Insert(int c,int n)
{
s[n]=c;
int p=Find(las[n-1],n);
if(!son[p][c])
{
int np=++tot;
memset(son[np],0,sizeof son[np]);
fail[np]=son[Find(fail[p],n)][c];
son[p][c]=np, len[np]=len[p]+2;
ans[np]=ans[fail[np]]+len[np];
}
Ans+=ans[las[n]=son[p][c]];
}
void DFS(int x,int dep)
{
for(int v=H[x]; v; v=nxt[v])
Insert(tmp[v]-'a',dep), DFS(v,dep+1);
}
void Solve()
{
Init();
const int n=read();
for(int i=1; i<=n; ++i)
{
while(!isalpha(tmp[i]=gc()));
int fa=read();
nxt[i]=H[fa], H[fa]=i;
}
Ans=0, DFS(0,1), printf("%lld\n",Ans);
memset(H,0,n+1<<2);
}
}pam; int main()
{
for(int T=read(); T--; pam.Solve());
return 0;
}

HDU.5394.Trie in Tina Town(回文树)的更多相关文章

  1. HDU 5421 Victor and String(回文树)

    Victor and String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/262144 K (Java/Othe ...

  2. HDU 5157 Harry and magic string(回文树)

    Harry and magic string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  3. HDU 5658 CA Loves Palindromic(回文树)

    CA Loves Palindromic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/O ...

  4. HDU 6599 I Love Palindrome String (回文树+hash)

    题意 找如下子串的个数: (l,r)是回文串,并且(l,(l+r)/2)也是回文串 思路 本来写了个回文树+dfs+hash,由于用了map所以T了 后来发现既然该子串和该子串的前半部分都是回文串,所 ...

  5. HDU - 5421:Victor and String (回文树,支持首尾插入新字符)

    Sample Input 6 1 a 1 b 2 a 2 c 3 4 8 1 a 2 a 2 a 1 a 3 1 b 3 4 Sample Output 4 5 4 5 11 题意:多组输入,开始字符 ...

  6. HDU - 5157 :Harry and magic string (回文树,求多少对不相交的回文串)

    Sample Input aca aaaa Sample Output 3 15 题意: 多组输入,每次给定字符串S(|S|<1e5),求多少对不相交的回文串. 思路:可以用回文树求出以每个位置 ...

  7. Victor and String HDU - 5421 双向回文树

    题意: 有n种操作,开始给你一个空串,给你4中操作 1 c  在字符串的首部添加字符c 2 c  在字符串的尾部添加字符c 3  询问字符中的本质不同的回文串的个数 4 询问字符串中回文串的个数 思路 ...

  8. Interesting HDU - 5785 回文树

    题意: 找出所有[i,j]为回文串[j+1,k]也为回文串的i*k乘积之和. 题解: 设sum1[i] 为正着插入,到 i 的所有回文串的起始位置的前缀和,sum2[i] 表示反正插入的前缀和 ans ...

  9. 杭电多校HDU 6599 I Love Palindrome String (回文树)题解

    题意: 定义一个串为\(super\)回文串为: \(\bullet\) 串s为主串str的一个子串,即\(s = str_lstr_{l + 1} \cdots str_r\) \(\bullet\ ...

随机推荐

  1. 在vue项目中使用axios发送FormData

    这个是axios的中文文档,挺详细的: https://www.kancloud.cn/luponu/axios/873153 文档中的    使用 application/x-www-form-ur ...

  2. eclipse创建动态maven项目

    需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...

  3. iOS 测试之非代码获取 iPhone 型号及其他信息

    首先 安装libimobiledevice和ideviceinstaller $ brew uninstall ideviceinstaller $ brew uninstall libimobile ...

  4. selenium+python-文件下载(SendKeys)

    前言 文件下载时候会弹出一个下载选项框,这个弹框是定位不到的,有些元素注定定位不到也没关系,就当没有鼠标,我们可以通过键盘的快捷键完成操作. SendKeys库是专业的处理键盘事件的,所以这里需要用S ...

  5. spring cloud Hystix熔断机制--基本熔断配置和Fegin client熔断配置

    所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的提供方出现了问题之后整个的程序将出现错误的信息显示 ...

  6. js基本类型和字符串的具体应用

    变量 JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定. 定义变量需要用关键字 'var' var a = 123; var b = 'asd'; //同时定义多个 ...

  7. Python(文件操作实例)

    给定一个文件:以及给定的字符,比如“a”; 统计字符个数:(可选) # 文件的打开操作f = open("wyl.txt","r")# 文件的读取操作conte ...

  8. Spark的Streaming和Spark的SQL简单入门学习

    1.Spark Streaming是什么? a.Spark Streaming是什么? Spark Streaming类似于Apache Storm,用于流式数据的处理.根据其官方文档介绍,Spark ...

  9. eclipse工具下hadoop环境搭建

    eclipse工具下hadoop环境搭建:    window10操作系统中搭建eclipse64开发系统,配置hadoop的eclipse插件,让eclipse可以查看Hdfs中的文件内容.     ...

  10. Scala学习教程笔记一之基础语法,条件控制,循环控制,函数,数组,集合

    前言:Scala的安装教程:http://www.cnblogs.com/biehongli/p/8065679.html 1:Scala之基础语法学习笔记: :声明val变量:可以使用val来声明变 ...