循环字符串的最小表示法
来源:互联网 发布:淘宝卖家怎样设置运费 编辑:程序博客网 时间:2024/05/29 08:37
循环字符串的最小表示法的问题可以这样描述:
对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。
由于语言能力有限,还是用实际例子来解释比较容易:
设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。
对于字符串循环同构的最小表示法,其问题实质是求S串的一个位置,从这个位置开始循环输出S,得到的S’字典序最小。
一种朴素的方法是设计i,j两个指针。其中i指向最小表示的位置,j作为比较指针。
令i=0,j=1
如果S[i] > S[j] i=j, j=i+1
如果S[i] < S[j] j++
如果S[i]==S[j] 设指针k,分别从i和j位置向下比较,直到S[i] != S[j]
如果S[i+k] > S[j+k] i=j,j=i+1
否则j++
返回i
起初,我想在j指针后移的过程中加入一个优化。就是j每次不是加1,而是移动到l位置。其中,l>j且S[l]<=S[j]。但是,即使加入这一优化,在遇到bbb…bbbbbba这样的字符串时复杂度将退化到O(n^2)。
注意到,朴素算法的缺陷在于斜体的情况下i指针的移动太少了。针对这一问题改进就得到了最小表示法的算法。最小表示法的算法思路是维护两个指针i,j。
令i=0,j=1
如果S[i] > S[j] i=j, j=i+1
如果S[i] < S[j] j++
如果S[i]==S[j] 设指针k,分别从i和j位置向下比较,直到S[i] != S[j]
如果S[i+k] > S[j+k] i=i+k
否则j++
返回i和j的小者
注意到上面两个算法唯一的区别是粗体的一行。这一行就把复杂度降到O(n)了。
值得一提的是,与KMP类似,最小表示法处理的是一个字符串S的性质,而不是看论文时给人感觉的处理两个字符串。
应用最小表示法判断两个字符串同构,只要将两个串的最小表示求出来,然后从最小表示开始比较。剩下的工作就不用多说了。
题目 :点击打开链接
const int maxn = 100008 ;int s[maxn] ;int MinimumRepresentation(int l){ int i = 0, j = 1, k = 0, t; while(i < l && j < l && k < l) { t = s[(i + k) >= l ? i + k - l : i + k] - s[(j + k) >= l ? j + k - l : j + k]; if(!t) k++; else{ if(t > 0) i = i + k + 1; else j = j + k + 1; if(i == j) ++ j; k = 0; } } return (i < j ? i : j);}int a[maxn] ;int main(){ int i , j , n ; while(cin>>n){ for(i = 0 ; i < n ; i++) scanf("%d" , &s[i]) ; int d = MinimumRepresentation(n) ; j = 0 ; for(i = d ; i < n ; i++) a[j++] = s[i] ; for(i = 0 ; i < d ; i++) a[j++] = s[i] ; for(i = 1 ; i < n ; i++){ if(a[i] < a[i-1]) break ; } if(i < n) printf("%d\n" , -1) ; else printf("%d\n" , n-d == n ? 0 : n-d) ; } return 0 ;}
- 【字符串循环同构的最小表示法】
- 循环字符串的最小表示法
- 【理解字符串循环同构的最小表示法】
- 理解字符串循环同构的最小表示法
- 【理解字符串循环同构的最小表示法】
- 字符串循环同构的最小表示法(转)
- 【理解字符串循环同构的最小表示法】
- 【理解字符串循环同构的最小表示法】
- 理解字符串循环同构的最小/最大表示法+模板
- 最小表示法 字符串循环同构问题
- 字符串的最小表示法
- 字符串的最小表示法
- 字符串的最小表示法
- 字符串的最小表示
- 最小表示法求两个字符串是否循环相等
- 字符串循环同构——最小表示法の板子
- 字符串最小表示法
- 字符串最小表示法
- uva 10743 - Blocks on Blocks(矩阵快速幂)
- eclipse中对项目进行分类管理
- hdu2019 数列有序!
- HTML快速入门
- 使用Altium Designer 画板奇怪提示:Isolated copper: Split Plane
- 循环字符串的最小表示法
- POJ 题目1328 Radar Installation(贪心)
- 最近闲暇无事,做了一个UDP监控的程序,贴出源码,供大家参考。
- ubuntu安装配置tomcat7
- 关于在linux下部署php项目
- pdflush代码分析
- squid的安装和使用
- sql分页取数据,或者取个别条数据
- Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew