正题

题目链接: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. pycharm使用Djiago创建第一个web项目

    安装PyCharm专业版(注意社区版创建Djiago需要配置,比较麻烦) 创建Djiago项目点上 1.Inherit glocal site-packages(不然pycharm不去下载Djiago ...

  2. git忽略文件夹提交以及gitignore修改后不生效的解决办法

    1.在 .gitgnore 文件加入需要忽略的问价夹正则表达式: 在配置完以后提交代码,你可能会发现git忽略配置不生效! 解决办法,将缓存的文件重新添加一下即可 2.打开命令行,将下面三个命令复制粘 ...

  3. JDK1.5新特性之注解

    时间:2017-1-2 20:14 --注解的概述    注释是给人看的,而注解是给程序(框架)看的.    在Servlet3.0中可以使用注解来替代配置文件,开发者就不用再写配置文件了,而是写注解 ...

  4. DFS常规解题套路

    本文为xdfApp团队成员文章,原文链接:https://blog.csdn.net/sinat_37380158/article/details/106866970 作者介绍:韩沛沛, 北京邮电大学 ...

  5. 新东方集团K12公益免费课战役记

    作者:张建鑫, 曾任IBM高级软件架构师, 滴滴高级技术专家, 现任新东方集团高级技术总监 1月31日,集团领导决定由产品技术中心的新东方APP团队牵头做周一到周五的集团公益课, 提供给全国中小学生使 ...

  6. 《网页布局基础篇》—浮动布局和float属性

    浮动布局 <html> <head> <meta charset="utf-8"> <title>浮动</title> ...

  7. OpenCV 传统分割测试

    github官网源文件:https://github.com/opencv/opencv/tree/master/samples/python 最好是先克隆整个仓库下来,再测试里面的:floodfil ...

  8. vue 手写倒计时,样式需要自己调。( 亲测可用,就是没有样式 )

    先写一个 js 文件,这个文件是工具类文件,需要单独开一个js // 计算出时间戳的具体数据:比如将85400转化为 n天n时n分n秒 export function formateTimeStamp ...

  9. C#新版本风格(NetCore)项目文件

    在VisualStudio中创建NetCore以上版本的项目,使用的都是新版本风格的项目文件. 和旧版本.NetFramework版本的项目文件区别: 双击项目可直接打开csproj文件进行编辑配置 ...

  10. ubuntu-常用设置备忘

    环境 系统平台:Ubuntu 16.04.6 其他版本设置也差不多 vim喜好设置 系统安装vim sudo apt-get install vim 通过修改 /etc/vim/vimrc 文件设置 ...