正题

题目链接:https://www.luogu.com.cn/problem/P5287


题目大意

开始一个空串,\(n\)个操作

  1. 在末尾加入\(x\)个\(c\)字符(保证和\(c\)和前面的字符不同)
  2. 返回到第\(x\)次操作之后

每次操作完成后求所有前缀的最长的\(border\)长度和

\(1\leq n\leq 10^5\)


解题思路

二操作好像是一个离线树能搞出来的先只考虑一操作,因为是相当于求\(kmp\)之后的\(next\)和,所以可以考虑一下用\(kmp\)。

每个插入操作我们可以看做插入了一个二元组\((c,x)\),\(nxt_i\)表示按照二元组完全匹配来KMP的\(next\)数组。

然后求答案的时候设现在这个二元组\((c,x)\),已经匹配到\(now\)个\(c\),然后往前跳\(nxt\)的时候如果下一个二元组的字符是\(c\)且数量\(x>now\)那么我们就往后计算答案然后让\(now=x\)。

然后最后剩下的一些如果能和第一个匹配就全都匹配。

然后这样跑是能过的,但是加了二操作之后就会\(T\),因为KMP是均摊复杂度的,会被\(hack\)。

所以考虑一下怎么优化,我们知道\(broder\)可以被划分成\(log\)个等差数列,而且一定是按照长度来排列的,如果我们发现我们跳进了一个无法匹配的等差数列中我们就直接跳到这个等差数列结束的位置因为这个等差数列中已经不能匹配了。

这样复杂度就到了\(O(n\log n)\)了


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
using namespace std;
const ll N=1e5+10,P=998244353;
ll n,len,ch[N][2],s[N][3],ans[N],nxt[N],prt[N],p[N];
vector<ll> e[N];
ll gs(ll l,ll r)
{return (r+l)*(r-l+1)/2;}
void dfs(ll x){
ll i=nxt[len++];
s[len][0]=ch[x][0];
s[len][1]=ch[x][1];
s[len][2]=s[len-1][2]+ch[x][1];
ans[len]=ans[len-1];nxt[len]=0;
if(len==1){ans[len]=gs(1,ch[x][1]-1);}
else{
ll d=len-i;
while(i&&(s[i+1][0]!=ch[x][0]||s[i+1][1]!=ch[x][1])){
if(i-nxt[i]==d)i=i%d+d;
d=i-nxt[i];i=nxt[i];
}
nxt[len]=i+(i||(ch[x][0]==s[1][0]&&ch[x][1]>=s[1][1]));
ll now=0;i=nxt[len-1],d=len-1-i;
while(now<ch[x][1]&&i){
if(s[i+1][0]==ch[x][0]&&s[i+1][1]>now){
ans[len]+=gs(s[i][2]+now+1,s[i][2]+min(ch[x][1],s[i+1][1]));
now=s[i+1][1];
}
if(i-nxt[i]==d)i=i%d+d;
d=i-nxt[i];i=nxt[i];
}
if(now<ch[x][1]&&s[1][0]==ch[x][0]){
if(s[i+1][1]>now)ans[len]+=gs(now+1,min(ch[x][1],s[i+1][1]));
now=max(now,min(ch[x][1],s[i+1][1]));
ans[len]+=s[1][1]*(ch[x][1]-now);
}
}
prt[x]=ans[len];
for(ll i=0;i<e[x].size();i++)
dfs(e[x][i]);
len--;return;
}
signed main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
ll op;scanf("%lld ",&op);
if(op==1){
scanf("%lld %c",&ch[i][1],&ch[i][0]);
e[p[i-1]].push_back(p[i]=i);
}
else{
ll x;scanf("%lld",&x);
p[i]=p[x];
}
}
for(ll i=0;i<e[0].size();i++)
dfs(e[0][i]);
for(ll i=1;i<=n;i++)
printf("%lld\n",prt[p[i]]%P);
return 0;
}

P5287-[HNOI2019]JOJO【KMP】的更多相关文章

  1. 【KMP】【最小表示法】NCPC 2014 H clock pictures

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...

  2. 【动态规划】【KMP】HDU 5763 Another Meaning

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: T组数据,给两个字符串s1,s2(len<=100000),s2可以被解读成 ...

  3. HDOJ 2203 亲和串 【KMP】

    HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  4. 【KMP】Censoring

    [KMP]Censoring 题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his ...

  5. 【KMP】OKR-Periods of Words

    [KMP]OKR-Periods of Words 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得A=PB.如果P≠A并且P不是一个 ...

  6. 【KMP】Radio Transmission

    问题 L: [KMP]Radio Transmission 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入 第一行给出字 ...

  7. 【kmp】似乎在梦中见过的样子

    参考博客: BZOJ 3620: 似乎在梦中见过的样子 [KMP]似乎在梦中见过的样子 题目描述 「Madoka,不要相信QB!」伴随着Homura的失望地喊叫,Madoka与QB签订了契约. 这是M ...

  8. 【POJ2752】【KMP】Seek the Name, Seek the Fame

    Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...

  9. 【POJ2406】【KMP】Power Strings

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

随机推荐

  1. SpringBoot集成websocket(java注解方式)

    第一种:SpringBoot官网提供了一种websocket的集成方式 第二种:javax.websocket中提供了元注解的方式 下面讲解简单的第二种 添加依赖 <dependency> ...

  2. Ubuntu 16.04LTS修改开机启动项

    装上Ubuntu16.04后,每次开机都得手选开机项,挺麻烦 sudo vi /etc/default/grub GRUB_DEFAULT=0GRUB_HIDDEN_TIMEOUT=0GRUB_HID ...

  3. ROS catkin_make error Could not find a package configuration file provided by "actionlib_msgs"

    在使用ROS catkin_make编译的时候,出现类似如下错误 CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cma ...

  4. 分享几个下载豆瓣资源的chrome插件

    最近chrome终于以4.69%的市场占有率击败firefox成为中国第二大浏览器.(第一当然是争霸宇宙的IE了) 虽然chrome官方应用程序商店有不少豆瓣的辅助插件,但大多没什么用.属于蛋疼插件. ...

  5. 【SpringMVC】RESTFul简介以及案例实现

    RESTful 概念 REST:Representational State Transfer,表现层资源状态转移. 资源 资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成.每个资源 ...

  6. JavaScript高级程序设计(读书笔记)之BOM

    BOM(Browser Object Model)提供了很多对象用于访问浏览器的功能,这些功能与任何网页内容无关. 8.1 window对象 BOM的核心对象是window,它表示一个浏览器实例.在浏 ...

  7. ubantu上面 NFS服务器安装

    ---恢复内容开始--- N月一更............ 本博客部分参照:https://blog.csdn.net/CSDN_duomaomao/article/details/77822883  ...

  8. FastAPI(1)- 简单介绍

    前言 为啥要学它呢,因为学 Flask 的时候发现有人更推荐它代替 Flask,看了下介绍,感觉很强,而且也能拿来做平台,当然学起来!卷起来! 为什么要使用 FastAPI ? 日渐没落的是后端 HT ...

  9. 浅谈 JVM GC 的安全点与安全区域

    OopMap 前文我们说到,JVM 采用的可达性分析法有个缺点,就是从 GC Roots 找引用链耗时. 都说他耗时,他究竟耗时在哪里? GC 进行扫描时,需要查看每个位置存储的是不是引用类型,如果是 ...

  10. 不写注释的程序员-Models

    Models 不写注释的程序员-Models # This is an auto-generated Django model module. # You'll have to do the foll ...