/*
set里的一定是本质不同的回文串,所以先建立回文树
当a可以通过nxt指针到达b,或者b可以通过fail指针到达a时,a就是b的子串
对于回文树里的每个结点u,我们可以将和其有关的结点为两部分:
1.结点下方的子树,这部分的所有结点都可以由u在两边加点得到,设大小为 size[u]
2.结点向上的fail链,这条链上的所有结点都是u的回文后缀,设大小为 tot[u]
那么所有fail链上的点都是u的子树的子串,所以u的贡献为size[u]*tot[u]
然后还要去重:对于u的子孙v, v的fail链可能会与u重合,重合部分的贡献在u处已经算过,那么显然v处就不用再算一次
所以dfs时要用vis标记被访问过的fail点,推出递归前回溯即可

*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
struct PAM{
int nxt[maxn][],len[maxn],fail[maxn];
int num[maxn],cnt[maxn];
int S[maxn],n,p,last;
int newnode(int l){
memset(nxt[p],,sizeof nxt[p]);
len[p]=l;
num[p]=cnt[p]=;
return p++;
}
void init(){
p=;
newnode();
newnode(-);
fail[]=;
last=n=;
S[]=-;
}
int get_fail(int x){
while(S[n-len[x]-]!=S[n])x=fail[x];
return x;
}
void add(int c){
c-='a';S[++n]=c;
int cur=get_fail(last);
if(!nxt[cur][c]){
int now=newnode(len[cur]+);
fail[now]=nxt[get_fail(fail[cur])][c];
nxt[cur][c]=now;
num[now]=num[fail[now]]+;
}
last=nxt[cur][c];
cnt[last]++;
}
int vis[maxn],size[maxn],tot[maxn];
void dfs1(int u){
size[u]=;
for(int i=;i<;i++)
if(nxt[u][i]){
int v=nxt[u][i];
dfs1(v);
size[u]+=size[v];
}
}
void dfs2(int u){
tot[u]=;
for(int x=u;!vis[x] && x>;x=fail[x])
tot[u]++,vis[x]=u;
for(int i=;i<;i++)
if(nxt[u][i]){
int v=nxt[u][i];
dfs2(v);
}
for(int x=u;vis[x]==u&&x>;x=fail[x])
vis[x]=;
}
long long count(){
for(int i=p-;i>=;i--)
cnt[fail[i]]+=cnt[i];
dfs1();dfs2();
dfs1();dfs2();
long long res=;
for(int i=;i<p;i++)
res=res+size[i]*tot[i];
return res-(p-);
}
}tr;
char s[maxn]; int main(){
int t;cin>>t;
for(int tt=;tt<=t;tt++){
scanf("%s",s);
int len=strlen(s);
tr.init();
for(int i=;i<len;i++)
tr.add(s[i]);
printf("Case #%d: %lld\n",tt,tr.count());
}
}

回文树上dfs——牛客多校第六场C的更多相关文章

  1. Palindrome Mouse(2019年牛客多校第六场C题+回文树+树状数组)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 问\(s\)串中所有本质不同的回文子串中有多少对回文子串满足\(a\)是\(b\)的子串. 思路 参考代码:传送门 本质不同的回文子串肯定是要 ...

  2. 牛客多校第六场-H-Pair

    链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...

  3. 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板

    链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...

  4. 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)

    链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...

  5. 2018牛客多校第六场 G.Pikachu

    题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...

  6. 同构图+思维构造——牛客多校第六场E

    考的其实是同构图的性质: 1.同构图的顶点数,边数相等 2.同构图通过点的映射后邻接矩阵相同 这篇博客讲的很好https://www.jianshu.com/p/c33b5d1b4cd9 本题还需要一 ...

  7. 牛客多校第六场 J Upgrading Technology dp

    题意: 有n个技能,一开始都是0级,第i个技能从j-1级升到j级,花费$c_{i,j}$,但是花费不一定是正的 所有的技能升到j级时,奖励$d_j$但是奖励也不一定是正的 题解: 用sum[i][j] ...

  8. 2019牛客多校第六场H Pair(数位DP 多个数相关)题解

    题意: 传送门 给你\(A,B,C\),要求你给出有多少对\((x, y)\)满足\(x\in [1,A],y\in [1,B]\),且满足以下任意一个条件:\(x \& y > C\) ...

  9. 牛客多校第六场G Is Today Friday?(吉姆拉尔森/蔡勒公式 + 思维)题解

    题意: 给你\(A-J\)的字母组成的日期,形式为\(yyyy/mm/dd\).现给你\(n\)个这样的串\((n<=1e5)\),问你把字母映射成数字,并且使得所有日期合法且为星期五的最小字典 ...

随机推荐

  1. 【LeetCode】水题(刚开始重新刷题找感觉用的)

    [9] Palindrome Number [Easy] 给一个数字,用不转化成字符串的方式判断它是否是回文. 先求数字长度,然后把数字的后半段做翻转(就是不断地取模,除10这种方式),然后判断前后半 ...

  2. 【Luogu】【关卡2-1】简单的模拟(2017年10月)

    任务说明:开始普及组的训练!所谓模拟,就是直接根据题意编写,思维难度简单. 铺地毯 进制转换 多项式输出 机器翻译 排座椅 笨小猴 都是简单模拟题  

  3. express 路由能力

    demo var express=require("express"); var app=express(); app.get("/",function(req ...

  4. phpass类加密算法

    客户说用md5加密容易被破解,要求使用bcrypt加密,经搜索发现password_hash函数可以轻松对密码实现加盐加密,比md5更安全,缺点是运行慢. phpass是一个开源类库,它可以让我们更方 ...

  5. SQL的判断重复新增或者修改

    <insert id="insertTankStatisticData" parameterType="java.util.Map"> <se ...

  6. vue基础五

    条件渲染 1.v-if 1.1<template>中v-if条件组 因为 v-if 是一个指令,需要将它添加到一个元素上.但是如果我们想切换多个元素呢?此时我们可以把一个<templ ...

  7. Android中的Service的使用详解

    按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不 ...

  8. Redis Cluster集群详介绍和伪集群搭建

    1 什么是Redis-Cluster 为何要搭建Redis集群.Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系 ...

  9. Go语言基础:make,new, len, cap, append, delete方法

      前面提到不少Go的内建函数,这篇文章学习下如何使用.. make 先拿 make 开刀,可是一开始我就进入了误区,因为我想先找到他的源码,先是发现 src/builtin/builtin.go 中 ...

  10. eclipse修改项目访问前缀

    eclipse项目右击 properties---web project setting---context root修改项目访问前缀