【CF235C】Cyclical Quest(后缀自动机)

题面

洛谷

题解

大致翻译:
给定一个串
然后若干组询问
每次也给定一个串
这个串可以旋转(就是把最后一位丢到最前面这样子)
问这个串以及其旋转的串在给定的串中出现了多少次

显然,串可以旋转,那么考虑在后面再接一份就行了

匹配的话就是后缀自动机的匹配
但是额外的注意一点
如果当前匹配出来的最大长度\(>=len\)
也就是当前串的长度
那么就要跳父亲

因为旋转后可能有相同的串出现
所以要开一个数组记录当前节点是否已经算过答案

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1200000
inline int read()
{RG int x=0,t=1;RG char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
struct Node
{int son[26];int ff,len;
}t[MAX<<1];
int last=1,tot=1;
int size[MAX<<1];
ll sum[MAX<<1];
char ch[MAX];
int a[MAX],c[MAX];
int vis[MAX];
void extend(int c)
{int p=last,np=++tot;t[np].len=t[p].len+1;size[last=np]++;while(p&&!t[p].son[c])t[p].son[c]=np,p=t[p].ff;if(!p)t[np].ff=1;else{int q=t[p].son[c];if(t[q].len==t[p].len+1)t[np].ff=q;else{int nq=++tot;t[nq]=t[q];t[nq].len=t[p].len+1;t[q].ff=t[np].ff=nq;while(p&&t[p].son[c]==q)t[p].son[c]=nq,p=t[p].ff;}}
}
int main()
{scanf("%s",ch+1);int n=strlen(ch+1);for(int i=1;i<=n;++i)extend(ch[i]-97);for(int i=1;i<=tot;++i)c[t[i].len]++;for(int i=1;i<=tot;++i)c[i]+=c[i-1];for(int i=1;i<=tot;++i)a[c[t[i].len]--]=i;for(int i=tot;i;--i)size[t[a[i]].ff]+=size[a[i]];memset(vis,63,sizeof(vis));int Q=read();while(Q--){scanf("%s",ch+1);int l=strlen(ch+1);for(int i=1;i<l;++i)ch[i+l]=ch[i];int now=1,len=0;ll ans=0;for(int i=1;i<l+l;++i){int c=ch[i]-97;while(now&&!t[now].son[c])now=t[now].ff,len=t[now].len;if(!now)now=1,len=0;else now=t[now].son[c],len+=1;while(now&&t[t[now].ff].len>=l)now=t[now].ff,len=t[now].len;if(len>=l&&vis[now]!=Q)ans+=size[now],vis[now]=Q;}cout<<ans<<endl;}return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/8467693.html

【CF235C】Cyclical Quest(后缀自动机)相关推荐

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

    题目链接: https://codeforces.com/contest/235/problem/C 题解: 对大串建后缀自动机 对询问串复制拆环.这里一定要注意是复制一个循环节不是复制整个串!循环节 ...

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

    传送门 题意:给定一个模式串和nnn个匹配串,询问原串有多少个子串和匹配串循环同构 考虑要求循环同构,于是先对SSS建出后缀自动机 把每次询问的XXX倍长在自动机上跑 如果当前匹配的长度已经超过原串长 ...

  3. CF235C Cyclical Quest

    题意: 给出一个字符串s: n次询问某个字符串xi的循环同构串在s中出现多少次: |s|,∑|xi|<=10^6,n<=10^5: 题解: WJMZBMR场的SAM题... 感觉还没学多久 ...

  4. CodeForces 235C Cyclical Quest (后缀自动机)

    题意:给一个主串,再给出多个模式串,分别求主串中有多少个连续子串,与模式串循环同构. 题解:后缀自动机 因为要求循环同构,所以将模式串复制放到后面.(要么加终止符,要么传入长度) 先对主串建sam,然 ...

  5. 【POJ1509】Glass Beads 【后缀自动机】

    题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...

  6. bzoj 2946 [Poi2000]公共串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...

  7. 后缀自动机 ---- P3804 【模板】后缀自动机(求每个等价类最长串的出现次数)

    后缀自动机一些关键点 首先后缀自动机上面每个节点都是一个等价类并且是最长的字符串的结尾 后缀自动机上的fail链反建就是parent tree,下面是SAM和Parent tree的构造 对于这道模板 ...

  8. 洛谷P3966 [TJOI2013]单词(后缀自动机)

    传送门 统计单词出现次数--为啥大家都是写AC自动机的嘞--明明后缀自动机也能做的说-- 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...

  9. hihocoder 后缀自动机专题

    一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...

  10. BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)

    Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...

最新文章

  1. 腾讯微视AI新技术曝光:斩获VCR榜单第一
  2. 使用 istringstream 遇到的一点小问题
  3. 龙芯上市是自主路线被广泛认可的风向标
  4. tomcat java环境配置
  5. android 百度地图api密钥,Android百度地图开发获取秘钥之SHA1
  6. 微信开发实现一键拨号出现屏蔽问题的解决方案
  7. centos中 npm install 被kill的解决方案
  8. PostgreSQL是否区分大小写
  9. android avrcp处理流程,(VR虚拟现实)Android 蓝牙AVRCP功能的实现.doc
  10. 酒店管理系统-可行性研究报告
  11. Mybatis 自定义自动分页
  12. android 服务自动运行怎么办,Android服务开机自动运行
  13. 免费站群系统cm-SEO需要多长时间?
  14. 股权-公司治理的至高点,如何合理运用股权(融人、融资、融市场) 张明若
  15. java集合类-list
  16. 【三维目标检测】3DSSD(一)
  17. 如何将图像保存至计算机G7X,opencv之读入一幅图像,显示图像以及如何保存一副图像,基础操作...
  18. asp.net后台为控件添加css样式
  19. 雅虎通推出 PingMe 服务,酷!
  20. Jmeter压测输出可观报告--用表格察看结果(view results in table)输出excel格式

热门文章

  1. pyinstaller使用错误 SyntaxError: Non-UTF-8 code starting with '\xb4' in file C:......
  2. oracle中的INTERVAL函数用法
  3. 思科ccna认证怎么样关于思科ccnaDLSW技术简述
  4. 咸鱼Maya笔记—摄影表
  5. 导航栏菜单实现鼠标移入移出中英文切换的两种方法(css3和jQuery)
  6. html只能用鼠标进行各种操作,鼠标的基本操作有哪些?
  7. ArcGIS学习——菜单栏
  8. 学习————运算符!
  9. Firefly+AS3回合RPG网页游戏源码《烽烟OL》v1.6正式推出
  10. 花一个星期时间呕心沥血整理出高频软件测试/自动化测试面试题和答案