/*
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. 利用Process类创建多个子进程对象执行任务,主进程负责调度

    import time from multiprocessing import Process def run1(): for i in range(5): print("sunck is ...

  2. PHP多参数方法的重构

    假设我们要完成一个保存文章的功能,如果采用函数编程的方式,大概会是下面这个样子: <?php function saveArticle($title, $content, $categoryId ...

  3. JMeter Http请求之content-type用法

    转载自https://www.cnblogs.com/imyalost/p/6726795.html 本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及 ...

  4. Delphi ComboBox组件 style=csDropDownlist 的赋值方法

    赋值方法: ComboBox1.Items.Add( '文本 '); ComboBox1.ItemIndex := ComboBox1.Items.IndexOf( '文本 '); 清空: Combo ...

  5. TrMemo控件

    unit TrMemo; {$R-} interface uses Windows, Messages, Controls, StdCtrls, Classes; const TMWM__Specia ...

  6. NX二次开发-NXOpen::Drawings::DrawingSheet Class Reference

    NX11+VS2013 #include <NXOpen/Section.hxx> #include <NXOpen/SectionCollection.hxx> #inclu ...

  7. 资源-.Net-ASP.NET:ASP.NET资源列表

    ylbtech-资源-.Net-ASP.NET:ASP.NET资源列表 ASP.NETFree. Cross-platform. Open source.A framework for buildin ...

  8. PHP面试 PHP基础知识 一(引用变量)

    PHP引用变量 常见引用变量面试题: 什么是引用变量? 在PHP中用什么符号定义引用变量? 考点:PHP的引用变量的概念及定义方式 概念:在PHP中引用意味着用不用的名字访问同一个变量内容     定 ...

  9. CentOS6.8搭建LNMP环境

    selinux可能会致使编译安装失败,我们先禁用它.永久禁用,需要重启生效 sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/c ...

  10. divide方法

    java.math.BigDecimal.divide(BigDecimal divisor, RoundingMode roundingMode) 返回一个BigDecimal,其值为(this/除 ...