char s[N * 2]; scanf("%s", s + 1); int n = strlen(s + 1); for(int i = 1; i <= n; i++) s[i + n] = s[i]; int i = 1, j = 2, k; while(i <= n && j <= n) { for(k = 0; k < n && s[i + k] == s[j + k]; k++); if(k == n) break; //具有循环元 if(s[i + k] > s[j + k]) { i = i + k + 1; if(i == j) i++; } else { j = j + k + 1; if(j == i) j++; } } cout << min(i, j) << endl;
树的最小表示法

浙公网安备 33010602011771号