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]); }