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;

树的最小表示法

posted on 2022-03-12 11:12  我疯故我在  阅读(73)  评论(0)    收藏  举报