Codeforces 235C Cyclical Quest (后缀自动机)

题目链接: https://codeforces.com/contest/235/problem/C

题解:

对大串建后缀自动机

对询问串复制拆环。这里一定要注意是复制一个循环节不是复制整个串!循环节是要整除的那种

然后要做的实际上是在大串上跑,每经过一个点求出当前的最长公共子串,如果大于等于\(n\)的话,则向上跳Parent树找到\(n\in [minlen[v],maxlen[v]]\)的那个祖先\(v\)

这玩意直接做复杂度是错的(虽然貌似网上有直接做过了的),但是我们可以递推!

考虑递推,实际上就是维护一个长度为\(m\)(询问串长度)的队列,每次删掉第一个字符(就是判断如果当前最长公共子串长\(=n\)就变成\(n-1\), 如果需要的话跳到父亲),然后每次长度达到\(n\)\(ans+=len[u]\)即可。

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;const int N = 1e6;
const int S = 26;
char a[N+3];
char b[(N<<1)+3];
int son[(N<<1)+3][S+3];
int fa[(N<<1)+3];
int len[(N<<1)+3];
int vis[(N<<1)+3];
int ord[(N<<1)+3];
int buc[N+3];
int nxt[N+3];
int sz[(N<<1)+3];
int n,q,m,siz,rtn,lstpos;void initSAM()
{siz = rtn = lstpos = 1;
}void KMP()
{nxt[0] = nxt[1] = 0;for(int i=2; i<=m; i++){nxt[i] = nxt[i-1];while(nxt[i] && b[nxt[i]+1]!=b[i]){nxt[i] = nxt[nxt[i]];}if(b[nxt[i]+1]==b[i]) nxt[i]++;}
}void insertchar(char ch)
{int p = lstpos,np; siz++; np = lstpos = siz; len[np] = len[p]+1; sz[np]++;for(; p && son[p][ch]==0; p=fa[p]) {son[p][ch] = np;}if(p==0) {fa[np] = rtn;}else{int q = son[p][ch];if(len[q]==len[p]+1) {fa[np] = q;}else{siz++; int nq = siz; len[nq] = len[p]+1;memcpy(son[nq],son[q],sizeof(son[q]));fa[nq] = fa[q]; fa[q] = fa[np] = nq;for(; p && son[p][ch]==q; p=fa[p]) {son[p][ch] = nq;}}}
}int main()
{initSAM();scanf("%s",a+1); n = strlen(a+1);for(int i=1; i<=n; i++) a[i]-=96;for(int i=1; i<=n; i++) {insertchar(a[i]);}for(int i=1; i<=siz; i++) buc[len[i]]++;for(int i=1; i<=n; i++) buc[i] += buc[i-1];for(int i=siz; i>=1; i--) ord[buc[len[i]]--] = i;for(int i=siz; i>=1; i--){int u = ord[i];sz[fa[u]] += sz[u];}scanf("%d",&q);while(q--){scanf("%s",b+1); m = strlen(b+1);for(int i=1; i<=m; i++) b[i]-=96;KMP();int cyclen = nxt[m];while(cyclen>0 && m%(m-cyclen)!=0){cyclen = nxt[cyclen];}cyclen = m-cyclen;for(int i=1; i<cyclen; i++) b[i+m] = b[i];int u = rtn,cur = 0,ans = 0;for(int i=1; i<m+cyclen; i++){while(u && son[u][b[i]]==0) {u = fa[u]; cur = len[u];}if(son[u][b[i]]!=0) {u = son[u][b[i]]; cur++;}else {u = rtn; cur = 0;}if(cur==m){ans += sz[u];cur--;if(cur<=len[fa[u]]){u = fa[u];}}}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/suncongbo/p/11070462.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泛型型协变逆变_Java泛型类型简介:协变和逆变

泛型型协变逆变by Fabian Terh由Fabian Terh Java泛型类型简介&#xff1a;协变和逆变 (An introduction to generic types in Java: covariance and contravariance) 种类 (Types) Java is a statically typed language, which means you must first declare a variable and …

安卓系统换成linux系统软件,将旧安卓手机打造成“简易linux”机器,并部署AdGuardHome...

从原教程的安装Linux Deploy 完成后&#xff0c;在配置 Linux下载镜像的一些东西时有些许出入。首先&#xff0c;我是用的下载源地址是 http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports 清华的源挺好用的。 其他有出入的配置如图(记得把源地址改清华的&#xff0c;华中科大…

let与expr命令的用法与实战案例

let命令的用法 格式&#xff1a; let 赋值表达式 【注】let赋值表达式功能等同于&#xff1a;&#xff08;赋值表达式&#xff09; 例子&#xff1a;给自变量i加8 12345678[rootXCN ~]# i2 [rootXCN ~]# let ii8 [rootXCN ~]# echo $i 10[rootXCN ~]# ii8 #去掉let定义 [root…

在使用ToolBar + AppBarLayout,实现上划隐藏Toolbar功能,遇到了一个坑。

问题&#xff1a;Android5.0以下版本Toolbar不显示沉浸式状态栏&#xff0c;没有这个问题&#xff0c;但是5.0以上版本&#xff0c;就出现了莫名其妙的阴影问题&#xff0c;很是头疼。 分享一下我的解决方案&#xff1a; 在AppBarLayout中加一个属性&#xff1a; app:elevation…

leetcode1476. 子矩形查询

请你实现一个类 SubrectangleQueries &#xff0c;它的构造函数的参数是一个 rows x cols 的矩形&#xff08;这里用整数矩阵表示&#xff09;&#xff0c;并支持以下两种操作&#xff1a; updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) 用 new…

msbuild构建步骤_如何按照以下步骤构建最终的AI聊天机器人

msbuild构建步骤by Paul Pinard保罗皮纳德(Paul Pinard) 如何按照以下步骤构建最终的AI聊天机器人 (How to build the ultimate AI chatbot by following these steps) 快速指南&#xff0c;可帮助您避免常见的陷阱 (A quick guide that helps you avoid common pitfalls) Bui…

第一章:最小可行区块链

概览区块数据结构区块哈希创世块创建区块保存区块链验证区块完整性选择最长链节点间通信操作节点架构运行测试小结概览 区块链的基础概念非常简单, 说白了就是一个维护着一个持续增长的有序数据记录列表的这么一个分布式数据库。在此章节中我们将实现一个简单的玩具版的区块链。…

Oracle Controlfile控制文件中记录的信息片段sections

初学Oracle的朋友肯定对Controlfile控制文件中到底记录了何种的信息记录而感到好奇&#xff0c;实际上我们可以通过一个视图v$controlfile_record_section来了解控制文件的信息片段&#xff1a; SQL> select type, record_size, records_total from v$controlfile_record_s…

linux 怎么禁止遍历目录,linux下遍历目录功能实现

/*编译:dir:dir.cgcc -o $ $<*/#include #include #include #include #include int do_search_dir(char *path);int do_check_dir(char *fullpath, char* truefullpath);void usage(char *apps);int count 0;intmain(int argc,char **argv){char fullpath[…

leetcode面试题 16.26. 计算器(栈)

给定一个包含正整数、加()、减(-)、乘(*)、除(/)的算数表达式(括号除外)&#xff0c;计算其结果。 表达式仅包含非负整数&#xff0c;&#xff0c; - &#xff0c;*&#xff0c;/ 四种运算符和空格 。 整数除法仅保留整数部分。 示例 1: 输入: “32*2” 输出: 7 代码 clas…

团队项目电梯会议视频

http://v.youku.com/v_show/id_XMjcyMjI3Mjk2NA.html?spma2hzp.8244740.userfeed.5!2~5~5~5!3~5~A转载于:https://www.cnblogs.com/jingxiaopu/p/6749776.html

arduino服务器_如何使用Arduino检查Web服务器的响应状态

arduino服务器by Harshita Arora通过Harshita Arora 如何使用Arduino检查Web服务器的响应状态 (How to use Arduino to check your web server’s response status) Last year, I created Crypto Price Tracker (an app which was acquired by Redwood City Ventures this yea…

leetcode486. 预测赢家(dp)

给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数&#xff0c;随后玩家 2 继续从剩余数组任意一端拿取分数&#xff0c;然后玩家 1 拿&#xff0c;…… 。每次一个玩家只能拿取一个分数&#xff0c;分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束…

linux怎么看文件状态,linux查看文件类型-file、状态-stat

linux查看文件类型-file、状态-stat首页 计算机相关 linux命令 linux查看文件类型-file、状态-statfile 命令可以用来查看文件类型-i mime type-s 读取字符或块设备文件最好指定[root192 tmp]# file freeclsfreecls: UTF-8 Unicode text[root192 tmp]# file -i freeclsfreecls:…

Linux课程笔记 Crond介绍

1. 定时任务比较及cron语法 Linux的任务调度可以分为两类&#xff1a; 系统自身执行的任务用户执行的工作Linux系统下另外两种定时任务软件&#xff1a; at&#xff1a;适合仅执行一次的调度任务&#xff0c;需要启动一个名为atd的服务 anacron&#xff1a;这个命令主要用于非…

Python 学习日记第二篇 -- 列表,元组

一、列表 列表是一个可以包含所以数据类型的对象的位置有序集合&#xff0c;它是可以改变的。 1、列表的序列操作&#xff08;Python3&#xff09; 123456789101112131415161718192021222324>>> one_list [1,2,3,4]>>> two_list ["jonny","…

【Gamma】PhyLab 测试报告

PhyLab Gamma测试报告 测试中发现的bug Gamma阶段新Bug Bug可能原因部分错误码设置与原先抛异常的逻辑冲突原先代码中使用了一些特殊的办法处理异常Beta未发现Bug Bug可能原因控制台新建实验编号不能以0开头后端处理编号会将其前导0去除&#xff0c;以数字形式存储&#xff0c;…

如何使用Node.js,Express和MongoDB设置GraphQL服务器

by Leonardo Maldonado莱昂纳多马尔多纳多(Leonardo Maldonado) 如何使用Node.js&#xff0c;Express和MongoDB设置GraphQL服务器 (How to set up a GraphQL Server using Node.js, Express & MongoDB) 从GraphQL和MongoDB开始的最直接的方法。 (The most straightforward…

leetcode954. 二倍数对数组(treemap)

给定一个长度为偶数的整数数组 A&#xff0c;只有对 A 进行重组后可以满足 “对于每个 0 < i < len(A) / 2&#xff0c;都有 A[2 * i 1] 2 * A[2 * i]” 时&#xff0c;返回 true&#xff1b;否则&#xff0c;返回 false。 示例 1&#xff1a; 输入&#xff1a;[3,1,…

linux文件内容打印成二进制,如何在二进制文件中只打印可打印字符(相当于Linux下的字符串)?...

在Python3中&#xff0c;以二进制模式打开文件会得到bytes的结果。迭代一个bytes对象可以得到0到255(包括0到255)的整数&#xff0c;而不是字符。从^{} documentation&#xff1a;While bytes literals and representations are based on ASCII text, bytes objects actually b…