BZOJ 2176 Strange string ——最小表示法

本来想用来练习后缀自动机的,但是100w有点虚(事实证明确实T掉了)。

只好上最小表示法。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define uch unsigned char
 
uch s[10000005];
int l,pos;
 
int main()
{
    scanf("%d",&l);
    scanf("%s",s+1);
    int i,j,k;
    i=1;j=2;k=0;
    while (i<=l&&j<=l)
    {
        k=0;
        while (s[(i+k-1)%l+1]==s[(j+k-1)%l+1]&&k<=l) k++;
        if (k==l) return i;
        if (s[(i+k-1)%l+1]>s[(j+k-1)%l+1])
        {
            if (i+k+1>j) i=i+k+1;
             else i=j+1;
        }
        else
        {
            if (j+k+1>i) j=j+k+1;
            else j=i+1;
        }
        pos=min(i,j);
    }
    F(i,1,l) printf("%c",s[(i+pos-1-1)%l+1]);
}

  

原文地址:https://www.cnblogs.com/SfailSth/p/6486725.html