这道题是求字符串最小表示的第一个字符在字符串中的位置。做之前看了IOI2003冬令营周源大神的
论文《浅析“最小表示法”思想在字符串循环同构问题中的应用》。这里虽然每个样例只有一个字符
串,但是我们可以构造出一个字符串s + 1,和s来找同构,然后取找到的位置i,j之中小的那个。
/*Accepted 100K 16MS C++ 700B 2012-08-03 09:39:45*/ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; const int MAXN = 10010; char s[MAXN]; int Minpre() { int i = 0, j = 1, k = 0, len = strlen(s), x, y; while(k < len && j < len && i < len) { x = (i + k) % len; y = (j + k) % len; if(s[x] < s[y]) j = j + k + 1, k = 0; else if(s[x] > s[y]) i = i + k + 1, k = 0; else ++ k; if(i == j) ++ j; } return min(i, j); } int main() { int T; scanf("%d", &T); while(T --) { scanf("%s", s); printf("%d\n", Minpre() + 1); } return 0; }