CF235C-Cyclical Quest【SAM】
正题
题目链接:https://www.luogu.com.cn/problem/CF235C
题目大意
一个文本串\(s\)。询问\(n\)个匹配的本质不同的循环同构在文本串中出现了几次。
解题思路
我们匹配完原串之后,相当与每次在头部删去一个字符然后又在末尾加上一个字符。使用\(SAM\)匹配的话,发现每次在\(parents\)树上条就相当于删去头部的字符,因为\(parents\)树上的祖先是属于同一个\(endpos\)类的,所以后面的字符不会改变,我们一直跳到满足\(L\in [minlen_x,maxlen_x]\)的节点即可。
要求本质不同的话,就直接在统计过答案的点打上标记,后面不统计即可。
时间复杂度\(O(|s|+\sum_{i=1}^n|t|)\)
\(code\)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e6+10;
int n,cnt,len[N],fa[N],siz[N],ch[N][26];
int last,ans,mark[N],c[N],p[N];
char s[N];
void Insert(int c){
int p=last,np=last=++cnt;
len[np]=len[p]+1;siz[np]++;
for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
if(!p)fa[np]=1;
else{
int q=ch[p][c];
if(len[q]==len[p]+1)fa[np]=q;
else{
int nq=++cnt;len[nq]=len[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[nq]));
fa[nq]=fa[q];fa[np]=fa[q]=nq;
for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;
}
}
return;
}
void solve(int p){
int l=strlen(s),L=0;
int x=1;
for(int i=0;i<l;i++){
int c=s[i]-'a';
while(x!=1&&!ch[x][c])
x=fa[x],L=len[x];
if(ch[x][c])x=ch[x][c],L++;
}
if(L==l&&mark[x]!=p)
mark[x]=p,ans+=siz[x];
for(int i=0;i<l-1;i++){
int c=s[i]-'a';
while(x!=1&&!ch[x][c])
x=fa[x],L=len[x];
if(ch[x][c])x=ch[x][c],L++;
if(L>l&&--L==len[fa[x]])
x=fa[x];
if(L==l&&mark[x]!=p)
mark[x]=p,ans+=siz[x];
}
return;
}
int main()
{
scanf("%s",s);int l=strlen(s);
cnt=last=1;
for(int i=0;i<l;i++)Insert(s[i]-'a');
for(int i=1;i<=cnt;i++) c[len[i]]++;
for(int i=1;i<=l;i++) c[i]+=c[i-1];
for(int i=1;i<=cnt;i++) p[c[len[i]]--]=i;
for(int i=cnt;i>=1;i--) siz[fa[p[i]]]+=siz[p[i]];
scanf("%d",&n);
for(int i=1;i<=n;i++){
ans=0;
scanf("%s",s),solve(i);
printf("%d\n",ans);
}
return 0;
}
CF235C-Cyclical Quest【SAM】的更多相关文章
- 【SAM】codevs3160-最长公共子串
[题目大意] 求两个字符串的最长公共子串. [思路] 对第一个字符串建立后缀自动机,第二个字符串去匹配.cnt记录当前最长公共子串的长度,而ret记录答案. p代表位置指针,初始在rt位置. 对于第二 ...
- 【SAM】BZOJ2882-工艺
[题目大意] 求一个循环数列的最小表示法. [思路] 最小表示法的正解:★ SAM乱搞,和前面的POJ那道一样.然而MLE了,当作学习一下map的用法^ ^ map的使用方法(来源:☆) 一.map的 ...
- 【SAM】BZOJ3998-弦论
[题目大意] 给出一个字符串,求第k大的子串.(输入1表示子串可重复,0表示不可重复) [思路] 显然,k大子串是后缀自动机的经典题型,可以利用后缀自动机的性质来解决.对于字符串 [前铺1]" ...
- 【SAM】POJ1509-Glass Beads
[题目大意] 求一个循环数列的最小表示法. [思路] 把原创复制一遍放在后面,建立SAM,从s按字典序开始跑长度L即可. 板子来源(作者见连接内):
- CF235C Cyclical Quest(SAM)
/* 统计串的出现次数显然可以在自动机上匹配出来即可 但是每次都挨个匹配的话会时间爆炸 那么考虑我们把串复制一份, 然后一起在后缀自动机上跑, 当我们匹配长度大于该串长度的时候强行失配即可 可能会有旋 ...
- 【CodeForces - 235C】Cyclical Quest 【后缀自动机】
题意 给出一个字符串s1和q个询问,每个询问给出一个字符串s2,问这个询问的字符串的所有不同的周期串在s1中出现的次数的和. 分析 对于s1建后缀自动机.对于询问的每个字符串s2,我们按照处理循环串的 ...
- Codeforces 235C Cyclical Quest 字符串 SAM KMP
原文链接https://www.cnblogs.com/zhouzhendong/p/CF235C.html 题目传送门 - CF235C 题意 给定一个字符串 $s$ ,多组询问,每组询问的形式为 ...
- CF235C Cyclical Quest
题意 给定一个长度为\(n\)的母串 \(q\)组询问 这个串可以旋转(就是把最后一位丢到最前面这样子) 问这个串以及其旋转的串在给定的串中出现了多少次 Sol 旋转就把它复制一遍接在后面 然后就在\ ...
- 【SPOJ - LCS2】Longest Common Substring II【SAM】
题意 求出多个串的最长公共子串. 分析 刚学SAM想做这个题的话最好先去做一下那道codevs3160.求两个串的LCS应该怎么求?把一个串s1建自动机,然后跑另一个串s2,然后找出s2每个前缀的最长 ...
随机推荐
- C#基础知识---?为何物
一. 可空类型修饰符(?)引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.可空类型的出现, ...
- 深入浅出Mybatis系列(二)---Mybatis入门
一.Mybatis环境搭建及简单实例 1. 新建web项目, 添加依赖包:mybatis包.数据库驱动包(我使用的是mysql).日志包(我使用的是log4j), 由于我的是maven项目, 那么添加 ...
- C# 串口开发
在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形.温度等).用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的: USB转串口 - ...
- ARP:地址解析协议
我们假设这样一个场景:你需要和你网络中的一个设备进行通信,这个设备可能是某种服务器.你用来创建这个通信的应用已经得到了这个远程主机的ip地址,也意味着系统已经有了用来构建它想要在第三层到第7层传递数据 ...
- 【Azure 应用服务】使用PowerShell脚本上传文件至App Service目录
问题描述 使用PowerShell脚本上传文件至App Service目录的示例 脚本示例 对文件进行上传,使用的 WebClient.UploadFile 方法进行上传.当文件夹中包含子目录,执行以 ...
- Redis(一):安装
Ubuntu中使用yum安装redis: sudo apt-get install redis-server # 安装redis,安装完成后会自动启动 ps aux|grep redis # 查看进程 ...
- VSCode Navigate Back/Forward
Navigate Back: In the menu bar Choose [Go] -> [Back] (Ctrl+Alt+-) Navigate Forward: In the menu b ...
- 快速入门PaddleOCR,并试用其开发一个搜题小工具
介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...
- 【CSS】模仿迅雷主页的按钮
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Spring MVC拦截器浅析
Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...