[SCU 4504] 奶牛合影 (最小表示法)
来源:互联网 发布:nginx 子域名跨域配置 编辑:程序博客网 时间:2024/05/29 21:34
SCU - 4504
给定一个循环串,问从哪个位置剖分能使得字典序最小
最小表示法裸题,后缀数组裸题
然而后缀数组我还不太会构造
所以转而学习了一下最小表示法
朴素算法:
将原数组复制一遍
枚举两个串的开头
每当
时间复杂度
最小表示法:
与朴素算法大致相同
就是在发现
证明如下:
不妨设
S[p1+k]>S[p2+k] ,则∀i∈[p−1,k) 都不可能成为最小串的头
因为如果其为最小串的头,那么可以在第二个串中对应找一个位置
使得Si1,i1+k>Si2,i2+k
所以∀i∈[p−1,k) 都不可能成为最小串的头同理
S[p1+k]<S[p2+k],∀i∈[p−2,k) 都不可能成为最小串的头
所以在发生失配时,头指针直接向后移动k+1 位S[p1+k]=S[p2+k] ,则 k就自增,不断比较,直到失配
或者当k==N 时,此时就得到了最小串p1≠p2 不妨设p2>p1
由 1和 2可知,p1−>p2 的字符都不可能是最小串的开头
由于S1==S2 ,所以相同结论可以映射到S2 上
所以就可得出p1 即最小串的开头
最后
如果
如果最小串唯一,那么有一个势必滑动出 N了,所以取最小的
显然尾指针最多移动 4*N次,所以算法时间复杂度
#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <map>#include <set>#include <queue>using namespace std;typedef pair<int,int> Pii;typedef long long LL;typedef unsigned long long ULL;typedef double DBL;typedef long double LDBL;#define MST(a,b) memset(a,b,sizeof(a))#define CLR(a) MST(a,0)#define Sqr(a) (a*a)const int maxn=3e5+10;int N;int inpt[2*maxn];int main(){ int T; scanf("%d", &T); for(int ck=1; ck<=T; ck++) { scanf("%d", &N); for(int i=0; i<N; i++) { scanf("%d", &inpt[i]); inpt[i+N]=inpt[i]; } int p1=0,p2=1; while(p1<N&&p2<N) { int len=0; while(inpt[p1+len]==inpt[p2+len]&&len<N) len++; if(len==N) break; if(inpt[p1+len]>inpt[p2+len]) p1+=len+1; else p2+=len+1; if(p1==p2) p2++; } int ansp=min(p1, p2); for(int i=ansp; i<ansp+N; i++) printf("%d ", inpt[i]); puts(""); } return 0;}
0 0
- [SCU 4504] 奶牛合影 (最小表示法)
- CQU 奶牛合影(裸最小表示法)
- SCU4504 奶牛合影 最小表示法
- [SCU 4507] 奶牛情书 (AC自动机)
- hdu2609(最小表示法)
- sgu232(最小表示法)
- 最小表示法/最大表示法 O(n)
- 蓝桥杯 - 安慰奶牛 (最小生成树)
- 安慰奶牛(最小生成树)
- scu - 3254 - Rain and Fgj(最小点权割)
- [SCU 4525] meixiuxiu学图论 (二分答案 | 最小生成树)
- SCU 4439: Vertex Cover(最小点覆盖)
- hdu 2609(字符串最小表示法)
- HDU(3374) (KMP + 最小表示法)
- 最小(大)表示法讲解
- bzoj 2882(最小表示法)
- HDU2609 How many(最小表示法)
- HDU4162 Shape Number(最小表示法)
- In-memory Computing with SAP HANA读书笔记 - 第三章:Software components and data replication methods
- android 慎用drawable中大图,造成内存溢出的解决方案
- EventBus使用详解(一)——初步使用EventBus
- [swift学习之九]异常处理
- mac Homebrew
- [SCU 4504] 奶牛合影 (最小表示法)
- Python实现杨辉三角形
- Concurrent包中Queue(2)----ArrayBlockingQueue
- red hat linux使用yum 出现Loaded plugins: rhnplugin, security
- 如何提高循环效率
- font-size使用em
- 披着函数外衣的关键字
- python lxf
- EventBus使用详解(二)——EventBus使用进阶