POJ 1509 Glass Beads【后缀自动机、最小表示法】
来源:互联网 发布:足球大数据分析 编辑:程序博客网 时间:2024/05/19 08:42
此题为最简单的后缀自动机的应用。
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int maxn = 10010;struct SamNode { int ch[26]; int par, len; void Init() { par = -1; len = 0; memset(ch, -1, sizeof(ch)); }};class SAM{public: void Init() { tot = 0; last = 0; sn[0].Init(); } void Add(int c) { int end = NewNode(); int tmp = last; sn[end].len = sn[last].len + 1; for ( ; tmp != -1 && sn[tmp].ch[c] == -1; tmp = sn[tmp].par) { sn[tmp].ch[c] = end; } if (tmp == -1) { sn[end].par = 0; } else { int nxt = sn[tmp].ch[c]; if (sn[tmp].len + 1 == sn[nxt].len) { sn[end].par = nxt; } else { int np = NewNode(); sn[np] = sn[nxt]; sn[np].len = sn[tmp].len + 1; sn[end].par = sn[nxt].par = np; for ( ; tmp != -1 && sn[tmp].ch[c] == nxt; tmp = sn[tmp].par) { sn[tmp].ch[c] = np; } } } last = end; } int tot; int last; SamNode sn[maxn*4]; int NewNode() { sn[++tot].Init(); return tot; }};int t, n;char s[maxn];SAM sam;int main(){ scanf("%d", &t); while (t--) { scanf("%s", s); sam.Init(); n = strlen(s); for (int i = 0; i < n; ++i) { sam.Add(s[i] - 'a'); } for (int i = 0; i < n; ++i) { sam.Add(s[i] - 'a'); } int now = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < 26; ++j) { if (sam.sn[now].ch[j] != -1) { now = sam.sn[now].ch[j]; break; } } } printf("%d\n", sam.sn[now].len - n + 1); } return 0;}
- POJ 1509 Glass Beads【后缀自动机、最小表示法】
- POJ-1509 Glass Beads (字符串最小表示法&后缀自动机)
- POJ 1509 Glass Beads(最小表示法、后缀自动机)
- uva 719 - Glass Beads(最小表示法 | 后缀自动机)
- SAM后缀自动机学习小记 Poj 1509 Glass Beads (字符串最小表示)
- poj 1509 Glass Beads【最小表示法】
- Glass Beads - POJ 1509 最小表示法
- POJ 1509 Glass Beads 后缀自动机
- 【POJ】1509 Glass Beads 【后缀自动机】
- POJ 1509 Glass Beads 后缀自动机
- [最小表示] poj 1509 Glass Beads
- POJ 1509 Glass Beads(字符串的最小表示法)
- POJ 1509 Glass Beads(SAM 求最小表示法)
- poj - 1509 - Glass Beads(最小表示法)
- poj 1509 Glass Beads (最小表示法,模板题)
- 【字符串最小表示法】 POJ 1509 Glass Beads
- POJ 1509 Glass Beads【字符串最小表示法】
- POJ 1509 Glass Beads(最小表示法)
- 虚拟内存
- jQuery UI Layout Plug-in 的使用
- 交换空间 和虚拟内存有什么区别?
- 判断两个有环的链表是否相交
- Google Protocol Buffer 的使用和原理
- POJ 1509 Glass Beads【后缀自动机、最小表示法】
- 登录shell与非登录shell
- 排序算法总结
- SQL常用函数集锦
- VC++绘图编程----怎样绘图
- C++ socket 编程基础(理论)
- uboot根目录下mkconfig分析,基于s3c2440
- Android学习9——ImageButton
- 显式调用构造函数、析构函数