1 条题解

  • 0
    @ 2026-1-11 10:31:07

    正解是后缀数组(SA),这里充分发扬人类智慧,用排序做法。简单说就是把原字符串进行排序,然后对于每个字符找到原字符串前一个,组成字符串输出就可以了。 下面是你们喜欢的code

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,a[200005];
    char s[200005];
    
    bool cmp(int x,int y){
        int i = x,j = y,k = 0;
        while(s[i] == s[j] && k < 50){
            i++,j++,k++;
        }
        return s[i] < s[j];
    }
    
    int main(){
    
        ios::sync_with_stdio(0),cin.tie(0);
        cin >> s,n = strlen(s);
        for(int i = 0;i < n;i++){
            a[i] = i,s[n + i] = s[i];
        }
        sort(a,a + n,cmp);
        for(int i = 0;i < n;i++){
            cout << s[a[i] ? a[i] - 1 : n - 1];
        }
    
        return 0;
    }
    
    • 1

    信息

    ID
    3029
    时间
    1000ms
    内存
    125MiB
    难度
    8
    标签
    递交数
    1
    已通过
    1
    上传者