zoukankan      html  css  js  c++  java
  • 最小表示法

    好像还没有写过最小表示法以前都是用SAM写的
    用两个指针(i)(j)指向开头两个不同的位置,然后找到它们往后第一个不同的地方(i + k),比较大小
    较大的移动指针(k + 1)
    直至到达末尾或者(k = len)

    由于两指针移动次数和比较次数时同阶的,所以复杂度是(O(n))
    BZOJ2882

    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<cmath>
    #include<map>
    #define LL long long int
    #define REP(i,n) for (int i = 1; i <= (n); i++)
    #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
    #define cls(s,v) memset(s,v,sizeof(s))
    #define mp(a,b) make_pair<int,int>(a,b)
    #define cp pair<int,int>
    using namespace std;
    const int maxn = 300005,maxm = 100005,INF = 0x3f3f3f3f;
    inline int read(){
    	int out = 0,flag = 1; char c = getchar();
    	while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
    	while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
    	return flag ? out : -out;
    }
    int A[maxn],n,pos;
    void work(){
    	int i = 0,j = 1,k = 0,t;
    	while (i < n && j < n && k < n){
    		t = A[(i + k) % n] - A[(j + k) % n];
    		if (!t) k++;
    		else {
    			if (t > 0) i += k + 1;
    			else j += k + 1;
    			if (i == j) j++;
    			k = 0;
    		}
    	}
    	pos = i < j ? i : j;
    }
    int main(){
    	n = read();
    	for (int i = 0; i < n; i++) A[i] = read();
    	work();
    	for (int i = 0; i < n; i++) printf("%d ",A[(pos + i) % n]);
    	return 0;
    }
    
    
  • 相关阅读:
    关于日期
    修改video标签自带按钮的默认样式
    vue相关
    手机
    国内优秀npm镜像
    一些技能整理
    小程序
    $('.mydiv>ul')和$('.mydiv ul')的不同
    Python 字符编码
    Python 正则表达式 补充
  • 原文地址:https://www.cnblogs.com/Mychael/p/9269833.html
Copyright © 2011-2022 走看看