COGS 2123. [HZOI 2015] Glass Beads
来源:互联网 发布:快速傅里叶变换算法 编辑:程序博客网 时间:2024/06/05 12:40
最小表示法,这里用后缀自动机实现。
刚刚学了后缀自动机,懵逼中。
ps:纯属为了练习后缀自动机,字符串最小表示法的专门算法比这快很多。
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int maxn=3001000;char s[maxn*2];int n;struct sam{ int a[maxn][30],mx[maxn],fa[maxn],last,cnt; sam(){ last=++cnt; } void insert(int c) { int p=last,np=last=++cnt;mx[np]=mx[p]+1; while(p&&!a[p][c]) a[p][c]=np,p=fa[p]; if(!p) fa[np]=1; else { int q=a[p][c]; if(mx[p]+1==mx[q]) fa[np]=q; else { int nq=++cnt;mx[nq]=mx[p]+1; memcpy(a[nq],a[q],sizeof(a[q])); fa[nq]=fa[q]; fa[np]=fa[q]=nq; while(a[p][c]==q) a[p][c]=nq;p=fa[p]; } } }}SAM;int main(){ freopen("MinRepresentations.in","r",stdin); freopen("MinRepresentations.out","w",stdout); scanf("%d%s",&n,s+1); for(int i=1;i<=n;i++) s[i+n]=s[i]; for(int i=1;i<=2*n;i++) SAM.insert(s[i]-'a'); for (int i=1,p=1;i<=n;i++) { for (int j=0;j<26;j++) if(SAM.a[p][j]) { putchar('a'+j); p=SAM.a[p][j]; break; } } puts(""); return 0;}/*10qqqqaabaaa*/
0 0
- COGS 2123. [HZOI 2015] Glass Beads
- [HZOI 2015] Glass Beads
- COGS 2580. [HZOI 2015]偏序 II
- COGS 2294. [HZOI 2015] 释迦 (FFT mod any prime)
- COGS-2282 [HZOI 2015]黑树白(树状数组+树链剖分)
- COGS 2580. [HZOI 2015]偏序 II (CDQ分治+BIT)
- uva 719 glass beads
- poj 1509 Glass Beads
- POJ1509--Glass Beads
- poj1509 Glass Beads SAM
- POJ 1509 Glass Beads
- poj1509 Glass Beads sam
- POJ 1509 Glass Beads
- [POJ] 1509 Glass Beads
- poj 1509 Glass Beads
- [SAM] POJ1509 Glass Beads
- POJ 1509Glass Beads
- ZOJ 2006 Glass Beads
- 【简单Web服务器搭建】基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
- OpenCV Python学习笔记(七)
- 动态规划:最长上升子序与0-1背包问题
- java实现对称加密(DES)
- anjularjs 学习1
- COGS 2123. [HZOI 2015] Glass Beads
- 基于CentOS6.6搭建LNMP服务器环境
- HDU1233 还是畅通工程 【最小生成树】
- Jenkins自动部署到Tomcat随机失败的问题
- 使用android studio中遇到的常见问题及解决方法
- ARM基础 六、ARM指令集
- Android 深入理解Android中的自定义属性(转载)
- 2706:麦森数
- 前端技能练习:span 标签的width 和 height