里程碑3——最小循环串
来源:互联网 发布:陕西省广电网络营业厅 编辑:程序博客网 时间:2024/05/04 13:12
树状数组是第一个让我惊叹的数据结构,后缀自动机是第二个!
#include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<map> #include<set> #include<cmath> #include<cassert> #include<cstring> #include<iomanip> using namespace std; #ifdef _WIN32 #define i64 __int64 #define out64 "%I64d\n" #define in64 "%I64d" #else #define i64 long long #define out64 "%lld\n" #define in64 "%lld" #endif /************ for topcoder by zz1215 *******************/ #define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++) #define FFF(i,a) for( int i = 0 ; i < (a) ; i ++) #define FFD(i,a,b) for( int i = (a) ; i >= (b) ; i --) #define S64(a) scanf(in64,&a) #define SS(a) scanf("%d",&a) #define LL(a) ((a)<<1) #define RR(a) (((a)<<1)+1) #define pb push_back #define CL(Q) while(!Q.empty())Q.pop() #define MM(name,what) memset(name,what,sizeof(name)) #define MC(a,b) memcpy(a,b,sizeof(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)<(b)?(a):(b)) #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout) const int inf = 0x3f3f3f3f; const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL; const double oo = 10e9; const double eps = 10e-9; const double pi = acos(-1.0); const int maxz = 200111; struct zz { int par; int to[26]; int len; void init() { par = 0; len = 0; MM(to,0); } }zx[maxz]; struct suffix_automaton { const static int head = 1; int last; int use; int get() { zx[++use].init(); return use; } void init() { last=1; use=0; get(); return ; } void extend(int c) { int end = get(); int now = last; zx[end].len = zx[last].len+1; last = end; for (; now && !zx[now].to[c]; now=zx[now].par) { zx[now].to[c]=end; } if (!now) { zx[end].par = head; } else { int to = zx[now].to[c]; if (zx[now].len+1 == zx[to].len) { zx[end].par = to; } else { int np = get(); zx[np] = zx[to]; zx[np].len = zx[now].len +1; zx[end].par = zx[to].par = np; for (; now && zx[now].to[c] == to; now=zx[now].par) { zx[now].to[c]=np; } } } } }SA; int main() { string s; string ans; while(cin>>s) { SA.init(); int c; for(int i=0;i<s.length();i++) { c = s[i]-'a'; SA.extend(c); } for(int i=0;i<s.length();i++) { c = s[i]-'a'; SA.extend(c); } ans = ""; int now = SA.head; char ch; for(int i=0;i<s.length();i++) { for(int j=0;j<26;j++) { if(zx[now].to[j]) { now = zx[now].to[j]; ch = 'a' + j; ans+=ch; break; } } } cout<<ans<<endl; } return 0; }
- 里程碑3——最小循环串
- 里程碑
- 里程碑
- 里程碑
- 里程碑
- 字符串循环同构——最小表示法の板子
- POJ 1961 Period——kmp求最小循环节
- hdu 3746 Cyclic Nacklace (kmp扩展—最小循环节)
- 【kmp算法—最小循环节】Cyclic Nacklace HDU
- 征服Perl——初识Perl——里程碑M1
- 征服Perl——基础知识——里程碑M3
- 征服Perl——基础知识——里程碑M4
- 征服Perl——哈希——里程碑M7
- Unix整理笔记——起步——里程碑M2
- Unix整理笔记——文件系统——里程碑M4
- Unix整理笔记——安全性——里程碑M13
- Unix整理笔记——Unix基础——里程碑
- 关于项目管理——里程碑管理的重要性
- MIDAS用事件及其触发顺序
- USB信号简介
- ORACLE考试编码、考试名称对应表
- symian 文件读写及读写流 -- 文件操作
- 解决MAVEN用assembly打包spring.handlers和spring.schemas出错的问题
- 里程碑3——最小循环串
- 关于JAVA接口“实例”
- Windows操作系统堆和栈的区别
- 也谈第一门编程语言应该学什么
- yum install 与 yum groupinstall 的区别
- cfree5文件标签混乱处理。
- 皮克定理
- 3.XML 树结构
- 4.XML 语法规则