字符串(后缀自动机):COGS 2399. 循环同构
这道题直接看代码吧。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxn=2000010; 6 int fa[maxn],len[maxn],rit[maxn],w[maxn],sa[maxn]; 7 int n,Q,cnt,lst,ch[maxn][26],vis[maxn]; 8 char s[maxn]; 9 struct SAM{ 10 SAM(){ 11 memset(fa,0,sizeof(fa)); 12 memset(len,0,sizeof(len)); 13 memset(rit,0,sizeof(rit)); 14 cnt=lst=1; 15 } 16 17 void Insert(int c){ 18 int p=lst,np=lst=++cnt;len[np]=len[p]+1; 19 while(p&&!ch[p][c])ch[p][c]=np,p=fa[p]; 20 if(!p)fa[np]=1; 21 else{ 22 int q=ch[p][c]; 23 if(len[p]+1==len[q])fa[np]=q; 24 else{ 25 int nq=++cnt;len[nq]=len[p]+1; 26 memcpy(ch[nq],ch[q],sizeof(ch[q])); 27 fa[nq]=fa[q];fa[q]=fa[np]=nq; 28 while(ch[p][c]==q)ch[p][c]=nq,p=fa[p]; 29 } 30 } 31 } 32 33 void Prepare(){ 34 //rit[1]=1; 35 for(int i=1,p=1;i<=n;i++) 36 rit[p=ch[p][s[i]-'a']]+=1; 37 for(int i=1;i<=cnt;i++)w[len[i]]+=1; 38 for(int i=1;i<=cnt;i++)w[i]+=w[i-1]; 39 for(int i=1;i<=cnt;i++)sa[--w[len[i]]]=i; 40 for(int i=cnt;i;i--)rit[fa[sa[i]]]+=rit[sa[i]]; 41 } 42 43 void Solve(int tim){ 44 scanf("%s",s+1);n=strlen(s+1); 45 for(int i=1;i<=n;i++)s[n+i]=s[i]; 46 int p=1,ans=0,l=0; 47 for(int i=1,c;i<2*n;i++){ 48 c=s[i]-'a'; 49 while(p!=1&&!ch[p][c]) 50 {p=fa[p];l=len[p];} 51 if(!ch[p][c])l=0; 52 else{p=ch[p][c];l+=1;} 53 54 if(l>=n){ 55 while(len[fa[p]]>=n)p=fa[p],l=len[p]; 56 if(vis[p]!=tim)vis[p]=tim,ans+=rit[p]; 57 } 58 } 59 printf("%d\n",ans); 60 } 61 }sam; 62 int main(){ 63 freopen("rotate.in","r",stdin); 64 freopen("rotate.out","w",stdout); 65 scanf("%s%d",s+1,&Q);n=strlen(s+1); 66 for(int i=1;i<=n;i++)sam.Insert(s[i]-'a'); 67 sam.Prepare();while(Q--)sam.Solve(Q+1); 68 return 0; 69 }
转载于:https://www.cnblogs.com/TenderRun/p/5697265.html
字符串(后缀自动机):COGS 2399. 循环同构相关推荐
- CodeForces 235C Cyclical Quest (后缀自动机)
题意:给一个主串,再给出多个模式串,分别求主串中有多少个连续子串,与模式串循环同构. 题解:后缀自动机 因为要求循环同构,所以将模式串复制放到后面.(要么加终止符,要么传入长度) 先对主串建sam,然 ...
- 字符串循环同构的最小表示法(转)
循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S'中字典序最小的一个. 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S'是S的循环同构的串 ...
- 【BZOJ-13962865】识别子串字符串识别 后缀自动机/后缀树组 + 线段树
1396: 识别子串 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 312 Solved: 193 [Submit][Status][Discus ...
- 【雅礼集训2017】字符串【后缀自动机】【数据分治】
题意:给定一个字符串SSS和mmm个区间[li,ri][l_i,r_i][li,ri],qqq次询问,每次给定长度为kkk的字符串www和区间[a,b][a,b][a,b],求对于所有i∈[a,b ...
- [十二省联考2019]字符串问题 后缀自动机 + 拓扑排序 + 最长路 + 倍增
题目描述: 给定一个长串 $S$,给定若干 $S$ 的子串 $a_{i}$, $b_{i}$,再给出一些 $a$ 串和 $b$ 串的支配关系. 构造一个长度最长的字符串,使得: 字符串只由 $a_{i ...
- 51nod 1292 字符串中的最大值V2(后缀自动机)
题意: 有一个字符串T.字符串S的F函数值可以如下计算:F(S) = L * S在T中出现的次数(L为字符串S的长度).求所有T的子串S中,函数F(S)的最大值. 题解: 求T的后缀自动机,然后所有每 ...
- 【算法竞赛学习笔记】后缀自动机SAM-超经典的字符串问题详解
title : 后缀自动机 date : 2021-11-11 tags : ACM,字符串 author : Linno 前置知识 KMP,Trie,AC自动机等字符串基础 DFA(有限状态自动机) ...
- 最长公共子串_两个字符串的最长公共子串(后缀自动机)
// 最长公共子序列(后缀自动机) typedef struct state {int len, link;map<char, int> next; }state;const int MA ...
- [学习笔记]后缀自动机
解决大部分字符串问题的大杀器 给一下clj课件:戳我 SAM是一个博大精深的算法.虽然没有像网络流家族,Tarjan家族一样拉帮结派,但是自身包含很多方法. 一.前言 字符串常见问题:各种匹配 1.L ...
- hihocoder 1465 : 后缀自动机五·重复旋律8(后缀自动机+最长公共子串)
1465 : 后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的 ...
最新文章
- 使用参数化化模型投影点云
- Hadoop应用实战100讲(二)-Hadoop常用命令汇总
- 六、 跨多个WebService管理Session
- Prepare for Mac App Store Submission--为提交到Mac 应用商店做准备
- 我的nginx iis 负载均衡学习(环境搭建)
- linux终端命令行用户名和密码,Linux入门篇 —— Linux 用户与组管理详解(system-config-users 命令行)| 七日打卡...
- 学习Jsoup(一)
- Swift - as、as!、as?三种类型转换操作使用一览
- apache 配置用户级目录
- CTFHub 备份文件下载
- 系列个人网站上线一周年总结
- java tld 方法重载_java 中的TLD文件
- Java自学路线总结
- k8s 的容器command用法相关
- 关于ant design pro中2个下拉列表,下列列表a的数据需要依据列表b选择的值来进行变化,无法及时获取
- 以太坊加密猫Crypto Kitty合约解析
- 华中师范大学计算机学院学分绩,华中师范大学学生学业成绩表(模板)
- Python中的base64、base32实例
- java与JSON语法及解析
- Ethereum 基础(一)
热门文章
- C# Windows异步I/O操作
- Vmware Linux设置固定IP
- Effective_STL 学习笔记(四十五) 注意 count、find、binary_search、lower_bound、upper_bound 和 equal_range 的区别...
- windows系统查看80端口被占用的程序并结束该程序运行
- RAC 特点 character
- linux下目录与文件的权限及特殊权限
- ios之alloc和init
- Cisco公司的CAR流量控制策略
- [小技巧]为Atlas AutoComplete加上滚动条
- 我常用的15 款开发工具!