反回文串 90pts悬关求调
查看原帖
反回文串 90pts悬关求调
775991
jianamisabina楼主2025/7/30 10:17
#include <iostream>
#include <vector>
#include <cstring>
#define int long long

using namespace std;

const int N = 1e5 + 10;
string s;
int let[128],p[N],x[N],y[N];
bool b[N];
vector <int> v[N];

signed main(){

    int c; cin >> c;
    int T;cin >> T;
    while(T --){
        memset(let,0,sizeof(let));
        memset(b,0,sizeof(b));
        memset(p,0,sizeof(p));
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        for(int i = 1;i <= 1e5;i ++) v[i].clear();
        int n;cin >> n >> s;
        s = ' ' + s;
        int pos = 0;
        for(int i = 1;i <= n;i ++){
            let[s[i]] ++;
            v[s[i]].push_back(i);
        }
        for(int i = 'a';i <= 'z';i ++){
            if(let[i] > let[pos]) pos = i;
        }
        if(let[pos] > n / 2){
            if(let[pos] == n) {cout << "Shuiniao\n";continue;}
            if((n & 1) && let[pos] == n - 1 && s[(n + 1)/2] != pos){
                cout << "Shuiniao\n";continue;
            }
            int sum = n - let[pos],tot = 0,tag = 0,tmp = 0;
            int sp = n - 2 * (sum - 1);
            
            for(int i = 1;i <= n;i ++){
                if((int)s[i] == pos && tot < sp / 2 - 1 && tmp == 0){
                    p[++tot] = i,b[i] = 1;
                }else if((int)s[i] == pos && tot < sp && tmp == 1){
                    p[++tot] = i,b[i] = 1;
                }else if((int)s[i] != pos && !tmp)p[++tot] = i,tmp = 1,b[i] = 1;
            }
            if(tot < sp){
                tot = 0;tmp = 0;
                memset(b,0,sizeof(b));
                for(int i = 1;i <= n;i ++){
                    if((int)s[i] == pos && tmp == 0){
                        p[++tot] = i,b[i] = 1;
                    }else if((int)s[i] == pos && tot < sp && tmp == 1){
                        p[++tot] = i,b[i] = 1;
                    }else if((int)s[i] != pos &&!tmp)p[++tot] = i,tmp = 1,b[i]=1;
                }               
            }
            cout << "Huoyu\n" << sum << '\n' << tot << ' ';
            for(int i = 1;i <= tot;i ++) cout << p[i] << ' ';
            cout << '\n';
            int sa = 0,sb = 0;
            for(int i = 1;i <= n;i ++){
                if(b[i]) continue;
                if((int)s[i] == pos) x[++sa] = i;
                else y[++sb] = i;
            }
            for(int i = 1;i <= sa;i ++){
                cout << 2 << ' ';
                if(x[i] > y[i]) swap(x[i],y[i]);
                cout << x[i] << ' ' << y[i] << '\n';
            }
        }else{
            int tot = 0;
            for(int i = 'a';i <= 'z';i ++){
                for(int t : v[i]){
                    if(tot < n / 2) x[++tot] = t;
                    else y[(++tot) - n / 2] = t;
                }
            }
            cout << "Huoyu\n" << n / 2 << '\n';
            for(int i = 1;i <= n / 2 - 1;i ++){
                if(x[i] > y[i]) swap(x[i],y[i]);
                cout << 2 << ' ' << x[i] << ' ' << y[i] << '\n';
            }
            if(n & 1){
                if(x[n/2] > y[n/2]) swap(x[n/2],y[n/2]);
                if(y[n/2] > y[n/2 + 1]) swap(y[n/2],y[n/2 + 1]);
                if(x[n/2] > y[n/2]) swap(x[n/2],y[n/2]);
                cout << 3 << ' ' << x[n/2] << ' ' << y[n/2] << ' ' << y[n/2+1] << '\n';
            }else{
                if(x[n/2] > y[n/2]) swap(x[n/2],y[n/2]);
                cout << 2 <<  ' ' << x[n/2] << ' ' << y[n/2] << '\n';
            }
        }
    }

    return 0;
}
2025/7/30 10:17
加载中...