POJ-1509 Glass Beads (字符串最小表示法&后缀自动机)
2016-03-02 13:41
393 查看
题目:
http://poj.org/problem?id=1509题意:
求一个字符串的最小表示法,就是找一个循环串从哪里开始可以有最小字典序的字符串。思路:
首先有经典的解法,通过两个指针直接对比扫一遍寻找最小表示。同时这道题是后缀自动机的模版题,只要把字符串乘二接入后缀自动机,然后扫一遍尽可能字典序最小就行了,其实这两个方法都是贪心去找。
代码:
最小表示法:#include <bits/stdc++.h> #define PI acos(-1.0) #define INF 0x3f3f3f3f #define MOD 1000000007 #define EPS 1e-6 #define N 112345 using namespace std; int n,m,sum,res,flag; char s ; int minString(char *s) { int i=0,j=1,k=0; int len=strlen(s); while(i<len&&j<len&&k<len) { if(s[(i+k)%len]==s[(j+k)%len])k++; else { if(s[(i+k)%len]>s[(j+k)%len])i=i+k+1; else j=j+k+1; if(i==j)j++; k=0; } } return i<j?i:j; } int main() { int i,j,k,kk,cas,T,t,x,y,z; scanf("%d",&T); cas=0; while(T--) { scanf("%s",s); printf("%d\n",minString(s)+1); } return 0; }
后缀自动机:
#include <bits/stdc++.h> #define PI acos(-1.0) #define INF 0x3f3f3f3f #define MOD 1000000007 #define EPS 1e-6 #define N 112345 using namespace std; int n,m,sum,res,flag; char s ; struct SAM { struct Node { int ch[26]; int f, len; void init() { f = -1, len = 0; memset(ch, 0xff, sizeof (ch)); } }; Node sn[N<<1]; int idx, last; void init() { idx = last = 0; sn[idx++].init(); } int newnode() { sn[idx].init(); return idx++; } 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].f) sn[tmp].ch[c] = end; if (tmp == -1) sn[end].f = 0; else { int nxt = sn[tmp].ch[c]; if (sn[tmp].len + 1 == sn[nxt].len) sn[end].f = nxt; else { int np = newnode(); sn[np] = sn[nxt]; sn[np].len = sn[tmp].len + 1; sn[end].f = sn[nxt].f = np; for (; tmp != -1 && sn[tmp].ch[c] == nxt; tmp = sn[tmp].f) sn[tmp].ch[c] = np; } } last = end; } }; SAM sam; int main() { int i,j,k,kk,cas,T,t,x,y,z; scanf("%d",&T); cas=0; while(T--) { scanf("%s",s); sam.init(); n=strlen(s); for(i=0;i<n*2;i++) sam.add(s[i%n]-'a'); for(t=0,i=0;i<n;i++) for(j=0;j<26;j++) if(sam.sn[t].ch[j]!=-1) { t=sam.sn[t].ch[j]; break; } printf("%d\n",sam.sn[t].len-n+1); } return 0; }
相关文章推荐
- 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
- iOS 成员变量跟属性的区别
- java运行时类型和编译时类型
- C Windows控制台字符版本俄罗斯方块
- 利用遗传算法演化一个棋类游戏的人工智能
- lintcode-easy-Merge Sorted Array
- C++ bind2nd 简单描述
- 深入浅出讲解:php的socket通信
- 今天遇到一个定义一个枚举变量的问题。
- 在javaee当中如何新建一个项目到配置
- BKDR Hash 函数实现
- 如何解决本地调试没问题,部署上去网页显示中文乱码的问题
- 我的决心书
- 嵌入式大牛开发经验心得
- SAP QUERY这个工具的使用
- 操作系统的定义及其他
- 如何使用Openlayers 3加载谷歌离线地图
- 操作checkbox复选框问题
- Java中接口和抽象类及其区别
- Java多线程四