求一个字符串在旋转置换群下最小字典表示。

用的是后缀数组(后缀自动机还是再听听jason_yu讲讲吧,关于right集合的部分还有问题)

最小表示法的思想很有好(判断两个对象在某一置换群划分下,是否等价,可以求出两个对象在该置换群划分下的最小表示,然后比较最小表示)

 #include <cstdio>
#include <cstring>
#define min(a,b) ((a)<(b)?(a):(b))
#define N 20010 int n, aa[N];
int sa[N], rk[N], ht[N], vv[N]; void expand( int *s, int *r, int *sa, int *rk, int k ) {
for( int i=; i<=n; i++ )
vv[r[s[i]]]=i;
for( int i=n; i>=; i-- )
if( s[i]>k ) sa[vv[r[s[i]-k]]--] = s[i]-k;
for( int i=n-k+; i<=n; i++ )
sa[vv[r[i]]--] = i;
for( int i=; i<=n; i++ )
rk[sa[i]] = rk[sa[i-]]+(r[sa[i]]!=r[sa[i-]]||r[sa[i]+k]!=r[sa[i-]+k]);
}
void calcht() {
for( int i=,k=; i<=n; i++ ) {
if( rk[i]== ) {
k = ht[i] = ;
continue;
}
int j=sa[rk[i]-];
while( aa[i+k]==aa[j+k] ) k++;
ht[i] = k;
if( k> ) k--;
}
}
void suffix() {
static int tsa[N], trk[N];
for( int i=; i<=; i++ ) vv[i] = ;
for( int i=; i<=n; i++ ) vv[aa[i]]++;
for( int i=; i<=; i++ ) vv[i]+=vv[i-];
for( int i=n; i>=; i-- ) sa[vv[aa[i]]--]=i;
for( int i=; i<=n; i++ )
rk[sa[i]] = rk[sa[i-]]+(aa[sa[i]]!=aa[sa[i-]]);
for( int k=; k<n; k<<= ) {
expand( sa, rk, tsa, trk, k );
for( int i=; i<=n; i++ )
sa[i]=tsa[i], rk[i]=trk[i];
}
calcht();
}
int sov() {
int nn = (n+)>>;
for( int i=; i<=n; i++ )
if( n-sa[i]+>=nn ) {
int rt = sa[i];
for( int j=i+; j<=n && ht[sa[j]]>=nn; j++ )
rt = min( rt, sa[j] );
return rt;
}
return -;
}
int main() {
int T;
scanf( "%d", &T );
while( T-- ) {
static char buf[N];
scanf( "%s", buf+ );
n = strlen( buf+ );
for( int i=; i<=n; i++ )
aa[i+n] = aa[i] = buf[i]-'a'+;
n += n;
suffix();
printf( "%d\n", sov() );
}
}

poj 1509的更多相关文章

  1. POJ 1509 最小表示法

    题目链接:http://poj.org/problem?id=1509 题意:给定一个字符串,求一个起点使字符串从该起点起的字符串字典序最小[题目的字符串起点从1开始] 思路:最小表示法模板题 #de ...

  2. ●POJ 1509 Glass Beads

    题链: http://poj.org/problem?id=1509 题解: 给出一个字符串,有一个操作:把首字符放到末尾,形成新的串.求任意次操作后,字典序最小的串的首字母在原串中的位置.(这就是最 ...

  3. POJ 1509 Glass Beads 后缀自动机 模板 字符串的最小表示

    http://poj.org/problem?id=1509 后缀自动机其实就是一个压缩储存空间时间(对节点重复利用)的储存所有一个字符串所有子串的trie树,如果想不起来长什么样子可以百度一下找个图 ...

  4. POJ 1509 Glass Beads【字符串最小表示法】

    题目链接: http://poj.org/problem?id=1509 题意: 求循环字符串的最小表示. 分析: 浅析"最小表示法"思想在字符串循环同构问题中的应用 判断两字符串 ...

  5. POJ 1509 Glass Beads

    Description 求字符串的最小循环表示. Sol SAM. 把原串复制一遍,建出SAM,然后每次选最小的一个跑 \(len\) 次,这就是最小循环表示的最后一个节点,然后 \(x-len+1\ ...

  6. UVA 719 / POJ 1509 Glass Beads (最小表示法/后缀自动机)

    题目大意: 给出一个长度为N的字符串,求其字典序最小的循环同构. N<=10W. 算法讨论: 算法一.最小表示法.定义题. 算法二.后缀自动机. Codes: #include <iost ...

  7. POJ 1509 Glass Beads---最小表示法

    题意: T组数据,每组数据给出一个字符串,求这个字符串的最小表示发(只要求输出起始位置坐标) SAM入门题(检测板子是否正确). 将字符串S加倍丢进SAM中,然后走字符串长度次,每次贪心的沿最小的边走 ...

  8. POJ 1509 循环同构的最小表示法

    题目大意: 给定一个字符串,可以把一段尾部接到头部,这样找到一个最小的字符串 方案一: 利用循环同构中找最小表示的方法来解决 论文参考http://wenku.baidu.com/view/438ca ...

  9. CSU训练分类

    √√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...

随机推荐

  1. java系统的优化

    1.tomcat.jboss.jetty的jvm内存,增大 2.数据库的优化,如MySQL的innodb_buffer_pool_size等参数,增大

  2. Visual Studio 2017 for Mac

    Visual Studio 2017 for Mac Last Update: 2017/6/16 我们非常荣幸地宣布 Visual Studio 2017 for Mac 现已推出. Visual ...

  3. 32 Profiling Go Programs 分析go语言项目

    Profiling Go Programs  分析go语言项目 24 June 2011 At Scala Days 2011, Robert Hundt presented a paper titl ...

  4. C# TimeSpan获取 年月

    public static string GetYearMonthDayString(this DateTime expires) { try { var now = DateTime.Now; Ti ...

  5. python网络编程-socketserver

    一:socketserver简化了网络服务器的编写. 它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer. 这4个类是同步进行处 ...

  6. NLP里面好的学习资料

    别人推荐的网址: http://ruder.io/deep-learning-nlp-best-practices/index.html#wordembeddings

  7. android studio 解决avd启动问题 ----waiting for target device come online

    android studio 模拟器打不开,一直停留在第三方.waiting for target  device  come online 问题解决方法 方法1.Android Emulator 未 ...

  8. JVM性能调优监控工具——jps、jstack、jmap、jhat、jstat、hprof使用详解

    摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...

  9. 关于更新SQLserver统计信息的存储过程

    1.建立t_mon_table_stat 用于存过需要更新统计信息的表 2.查找需要更新统计信息的表 insert into t_mon_table_stat SELECT DISTINCT SP.r ...

  10. oralce 笔记

    查某一表的行数 select max(rownum) from tablename 插入数据之前判断是否重复 insert into tablename (coloum1,coloum2) selec ...