2019牛客多校赛 第六场 C Palindrome Mouse (回文树/回文自动机)

 

大致题意:给你一个字符串,问这个字符串的子串中,有多少个本质不同的回文串恰好是另外一个回文串的子串,求这样的回文串的对数。

可以说,这是一个回文树/回文自动机的裸题吧。显然,在回文树里面,一个节点的所有后代都是回文串而且包含当前回文串,所以可以直接统计所有节点的size。然后,当前节点的所有后代也包含当前节点的fail回文串,所以后代的贡献也要算到fail上。那么,一个很显然的问题就是,为什么后代的贡献不用给当前点fail的fail呢?因为根据回文树的性质,当前点一定是其fail的fail的后代,所以不用重复统计。因此,我们建立回文树,然后遍历回文树,每到一个点看当前点和其fail是否被标记。如果被两个都没被标记,那么贡献就是2,有一个被标记那么贡献为1,否则为0。然后再打上标记,当遍历完这个点的子树之后,再去掉当前点的标记。最后,用每个点的贡献乘以size即可。具体见代码:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define eps 1e
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值