【HDU5421】Victor and String(回文树)

题面

Vjudge

大意:

你需要支持以下操作:

动态在前端插入一个字符

动态在后端插入一个字符

回答当前本质不同的回文串个数

回答当前回文串个数

题解

回文树前端插入的操作,学一学感觉并不难?

额外维护一下一个前端插入的\(last\)

然后就和后端插入一模一样,前端插入时就是前端插入的\(last\)

唯一会产生的影响的就是当前字符差完后,

发现现在的\(last\)就是整个串,那么就要更新另外一端的\(last\)为当前这一端的\(last\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 222222
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Node
{
int son[26],ff;
int len,dep;
}t[MAX];
char s[MAX];
ll ans;
int tot,l,r,pre,suf,n;
void init()
{
l=1e5,r=l-1;memset(s,'\0',sizeof(s));
memset(t,0,sizeof(t));ans=0;
t[pre=suf=0].ff=t[tot=1].ff=1;t[1].len=-1;
}
void extend(int c,int n,int &last,int op)
{
int p=last;
while(s[n]!=s[n-op*t[p].len-op])p=t[p].ff;
if(!t[p].son[c])
{
int v=++tot,k=t[p].ff;t[v].len=t[p].len+2;
while(s[n]!=s[n-op*t[k].len-op])k=t[k].ff;
t[v].ff=t[k].son[c];t[p].son[c]=v;
t[v].dep=t[t[v].ff].dep+1;
}
last=t[p].son[c];ans+=t[last].dep;
if(t[last].len==r-l+1)pre=suf=last;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
while(n--)
{
int opt=read();
if(opt<=2)
{
char c=getchar();
if(opt==1)s[--l]=c,extend(c-97,l,pre,-1);
else s[++r]=c,extend(c-97,r,suf,1);
}
else if(opt==3)printf("%d\n",tot-1);
else printf("%lld\n",ans);
}
}
return 0;
}

【HDU5421】Victor and String(回文树)的更多相关文章

  1. hdu5421 Victor and String 回文树(前后插入)

    题目传送门 题意:对一个字符串支持四种操作,前插入字符,后插入字符,询问本质不同的回文串数量和所有回文串的数量. 思路: 就是在普通回文树的基础上,维护suf(最长回文后缀)的同时再维护一个pre(最 ...

  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. The Preliminary Contest for ICPC Asia Xuzhou 2019 G. Colorful String 回文树

    签到提: 题意:求出每一个回文串的贡献 (贡献的计算就是回文串不同字符的个数) 题解: 用回文树直接暴力即可 回文树开一个数组cost[ ][26] 和val[ ] 数组: val[i]表示回文树上节 ...

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

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

  5. 2019 徐州网络赛 G Colorful String 回文树

    题目链接:https://nanti.jisuanke.com/t/41389 The value of a string sss is equal to the number of differen ...

  6. HDOJ 5421 Victor and String 回文串自己主动机

    假设没有操作1,就是裸的回文串自己主动机...... 能够从头部插入字符的回文串自己主动机,维护两个last点就好了..... 当整个串都是回文串的时候把两个last统一一下 Victor and S ...

  7. HDU 5421 Victor and String (回文自动机)

    题目大意:让你维护一个字符串,支持在开头结尾插入字符,以及查询本质不同的回文串数量以及回文串总数量 开头结尾都维护一个$last$指针,如果插入新字符后,整个串是一个回文串,就把另一个$last$赋值 ...

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

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

  9. HDU5421 Victor and String 和 APIO2014 回文串

    两道差不多的题,都是回文自动机right集合处理相关. Victor and String Victor loves to play with string. He thinks a string i ...

随机推荐

  1. [原][OSG]整理osg渲染一帧的流程

    参考:最长的一帧 先看下frame void ViewerBase::frame(double simulationTime) { advance(simulationTime);//记录仿真时间,帧 ...

  2. TP5框架whereor

    whereOr方法 Db::table('think_user') ->where('name','like','%thinkphp') ->whereOr('title','like', ...

  3. 雷林鹏分享:Ruby 循环

    Ruby 循环 Ruby 中的循环用于执行相同的代码块若干次.本章节将详细介绍 Ruby 支持的所有循环语句. Ruby while 语句 语法 while conditional [do] code ...

  4. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛

    题意:到一个城市得钱,离开要花钱.开始时有现金.城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0; 一个开始指针i,一个结尾指针j.指示一个区间.如果符合条件++j,并将收益加入sum中( ...

  5. ccf第二题总结

    1.游戏 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加, ...

  6. h1042 N!大数乘int

    计算10000以内某个数的阶乘,即大数乘以int,考虑到一个int存一个数位过于繁琐且浪费空间,采用万进制 一个int存四个位数,但注意除了最高位,其他位不够四位数时要加上前导0凑够四位: 例1234 ...

  7. EBS存储附件信息

    附件三种形式 1.文件 2.url 3.文本 三种方式存储不一样 1.文件是存blob 2.url是存一个链接信息,读出来的时候,就是一个蓝色可点链接    fnd_attached_document ...

  8. pos提交提交数据时碰到Django csrf

    我的github(PS:希望star):https://github.com/thWinterSun/v-admin 最近在用Vue写前端代码,再用vue-resource向后台提交数据.项目后台是用 ...

  9. forget word qz_out_b1

    1★ be bi prep 使~成为:   2★ bene b əni 好,善 :祈祷     3★ bi 2, 双重, 两个 bi   4★ by   b æ / 通过,在~之前  

  10. libxl 的使用,读取时间格式

    最近开发使用到 libxl,用的是3.8.0 破解版. 具体过程: 1.将lib.dll放在exe同目录下,在代码中引用 libxl.lib #pragma comment(lib, ".\ ...