USACO 5.5.2 字符串的最小表示法
这道题是最小表示法的一个应用, 代码如下:
/* ID: m1500293 LANG: C++ PROG: hidden */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s[100000 + 100]; int len; int mins(char s[], int len) { int i=0, j=1, k=0; while(i<len && j<len && k<len) { int t = s[(i+k)%len]-s[(j+k)%len]; if(!t) ++k; else { if(t > 0) i = i+k+1; else j = j+k+1; if(i == j) ++j; k = 0; } } return i<j?i:j; } int main() { freopen("hidden.in", "r", stdin); freopen("hidden.out", "w", stdout); int len; scanf("%d", &len); int idx = 0; while(scanf("%s", s+idx) != EOF) { idx += strlen(s+idx); } printf("%d\n", mins(s, len)); return 0; }