Victor and String[Bestcoder #52 1004](回文树)
题目描述
Victor喜欢玩字符串。他认为一个字符串是迷人的,当且仅当字符串是回文的。
Victor想玩n次。每次他都会做以下四种操作中的一种。
操作1:在字符串的开头添加一个字符 c。
操作2:在字符串的末尾添加一个字符 c。
操作3:询问不同的迷人子字符串的数量。
操作4:询问迷人子字符串的数量,必须计算从不同位置开始的相同子字符串的数量。
在一开始Victor有一个空字符串。
输入格式
输入包含几个测试用例,最多5个用例。 在每个测试用例中,第一行一个整数n表示操作的数量。
下面n行的第一个数字是整数op,表示操作的类型。如果op=1或2,后面会有一个小写的英文字母。
输出格式
对于每个查询操作(操作3或4),输出正确的答案。
样例
输入样例1
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
输出样例2
4
5
4
5
11
这是一道模板题,直接上代码。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = ;
struct Plalindrome_Tree{
int go[], len, fail;
ll fail_len;
}pt[N];
int pre, suf, tot;
ll ans;
int q;
int l, r;
char s[N];
void init() {
memset(s, -, sizeof(s));
memset(pt, , sizeof(pt));
tot = ans = ;
pre = suf = ;
l = ;
r = ;
}
void build() {
pt[++tot].len = -;
pt[].fail = pt[].fail = ;
pt[].fail_len = ;
pt[].fail_len = ;
}
void add_back(int c) {
int p = suf;
while (s[r - pt[p].len - ] != s[r]) p = pt[p].fail;
if (!pt[p].go[c]) {
int v = ++tot, k = pt[p].fail;
pt[v].len = pt[p].len + ;
while (s[r - pt[k].len - ] != s[r]) k = pt[k].fail;
pt[v].fail = pt[k].go[c];
pt[v].fail_len = pt[pt[k].go[c]].fail_len + ;
pt[p].go[c] = v;
}
suf = pt[p].go[c];
}
void add_front(int c) {
int p = pre;
while (s[l + pt[p].len + ] != s[l]) p = pt[p].fail;
if (!pt[p].go[c]) {
int v = ++tot, k = pt[p].fail;
pt[v].len = pt[p].len + ;
while (s[l + pt[k].len + ] != s[l]) k = pt[k].fail;
pt[v].fail = pt[k].go[c];
pt[v].fail_len = pt[pt[k].go[c]].fail_len + ;
pt[p].go[c] = v;
}
pre = pt[p].go[c];
}
int main() {
while (cin >> q) {
init();
build();
while (q--) {
int opt;
char ch;
cin >> opt;
switch (opt) {
case :
cin >> ch;
s[--l] = ch;
add_front(ch - 'a');
ans += pt[pre].fail_len - ;
if (pt[pre].len == r - l + ) suf = pre;
break;
case :
cin >> ch;
s[++r] = ch;
add_back(ch - 'a');
ans += pt[suf].fail_len - ;
if (pt[suf].len == r - l + ) pre = suf;
break;
case :
cout << tot - ;
puts("");
break;
case :
cout << ans;
puts("");
break;
default:
puts("Wrong Input");
break;
}
} }
return ;
}
Victor and String[Bestcoder #52 1004](回文树)的更多相关文章
- Victor and String HDU - 5421 双向回文树
题意: 有n种操作,开始给你一个空串,给你4中操作 1 c 在字符串的首部添加字符c 2 c 在字符串的尾部添加字符c 3 询问字符中的本质不同的回文串的个数 4 询问字符串中回文串的个数 思路 ...
- 【HDU5421】Victor and String(回文树)
[HDU5421]Victor and String(回文树) 题面 Vjudge 大意: 你需要支持以下操作: 动态在前端插入一个字符 动态在后端插入一个字符 回答当前本质不同的回文串个数 回答当前 ...
- HDU 5421 Victor and String(回文树)
Victor and String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/262144 K (Java/Othe ...
- 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 题意:多组输入,开始字符 ...
- hdu5421 Victor and String 回文树(前后插入)
题目传送门 题意:对一个字符串支持四种操作,前插入字符,后插入字符,询问本质不同的回文串数量和所有回文串的数量. 思路: 就是在普通回文树的基础上,维护suf(最长回文后缀)的同时再维护一个pre(最 ...
- HDU 5157 Harry and magic string(回文树)
Harry and magic string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 G. Colorful String 回文树
签到提: 题意:求出每一个回文串的贡献 (贡献的计算就是回文串不同字符的个数) 题解: 用回文树直接暴力即可 回文树开一个数组cost[ ][26] 和val[ ] 数组: val[i]表示回文树上节 ...
- HDU 6599 I Love Palindrome String (回文树+hash)
题意 找如下子串的个数: (l,r)是回文串,并且(l,(l+r)/2)也是回文串 思路 本来写了个回文树+dfs+hash,由于用了map所以T了 后来发现既然该子串和该子串的前半部分都是回文串,所 ...
- 2019 徐州网络赛 G Colorful String 回文树
题目链接:https://nanti.jisuanke.com/t/41389 The value of a string sss is equal to the number of differen ...
随机推荐
- Windows下运行MapReduce程序出现Could not locate executable null\winutils.exe in the Hadoop binaries.
运行环境:windows10 64位,虚拟机:Ubuntu Kylin 14.04,Hadoop2.7.1 错误信息: java.io.IOException: Could not locate ex ...
- 【STM32H7教程】第58章 STM32H7的硬件JPEG应用之图片解码显示
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第58章 STM32H7的硬件JPEG应用之图片解 ...
- 《JavaScript高级程序设计》读书笔记(三)基本概念第三小节 String、Object类型
内容---语法 上一小节---数据类型 本小节 String类型---流程控制语句---理解函数 String类型--零个或者多个16位Unicode字符组成字符序列,即字符串--可以由双引号&quo ...
- java编码格式大讲解
oracle 分页: -- 第一种 select * from (select aed.*, row_number() over(order by aed.created_date) rw from ...
- DataFrame loc和iloc的区别
loc loc是select by label(name) loc函数是选择dataframe中那一行的index == k的 iloc loc是select by position loc函数是选择 ...
- ZOJ4109 Welcome Party(2019浙江省赛)
并查集算连通块的数量,集合的个数就是必然不开心的人数,再跑bfs,用优先队列维护~ #include<bits/stdc++.h> using namespace std; ; vecto ...
- MQTT Web Toolkit - MQTT 在线客户端及服务器测试
MQTT Web Toolkit 是 EMQ 最近开源的一款 MQTT (WebSocket) 测试工具,支持线上 (tools.emqx.io) 访问使用.该工具采用了聊天界面形式,简化了页面操作逻 ...
- iOS APP语言国际化之应用内切换语言环境
最近接了一个项目,需求是要做一款应用的英文版本,客户并不清楚,以为要另做一个APP.沟通后告诉他们在之前应用基础上加个国际化功能就好,把之前的语言国际化重新梳理记录一下. 一般设置更改本地语言环境后, ...
- 解决 Anaconda 3.7更新出现CondaHTTPError与SSLError
1.问题描述: An HTTP error occurred when trying to retrieve this URL. HTTP errors are often intermittent, ...
- Chrome浏览器 HTML5看视频卡顿
定位问题 起初以为是flash的问题,但是在B站看视频,由html播放改为flash播放后,卡顿现象消失 将相同的B站视频,用edge播放,也无卡顿现象 可以确定,问题出在chrome身上 解决方法 ...