2 条题解

  • 0
    @ 2026-5-2 8:30:55
    #define LL long long
    using namespace std;
    int in[26];
    bool g[26][26];
    bool vis[26];
    vector<int> ord;
    
    bool dfs(int u){
        vis[u] = true;
        for(int v=0;v<26;v++){
            if(g[u][v]){
                if(vis[v]) return false;
                if(!dfs(v)) return false;
            }
        }
        ord.push_back(u);
        return true;
    }
    
    bool check(){
        memset(in,0,sizeof in);
        memset(g,0,sizeof g);
        memset(vis,0,sizeof vis);
        ord.clear();
        return true;
    }
    
    int main(){
        int T;
        cin>>T;
        while(T--){
            int n;
            cin>>n;
            vector<string> strs(n);
            for(int i=0;i<n;i++) cin>>strs[i];
            check();
            bool ok = true;
            for(int i=0;i<n&&ok;i++){
                for(int j=i+1;j<n&&ok;j++){
                    int len = min(strs[i].size(), strs[j].size());
                    int k=0;
                    while(k<len&&strs[i][k]==strs[j][k]) k++;
                    if(k==len){
                        if(strs[i].size()>strs[j].size()) ok=false;
                    }else{
                        int u = strs[i][k]-'a';
                        int v = strs[j][k]-'a';
                        if(!g[u][v]){
                            g[u][v] = true;
                            in[v]++;
                        }
                    }
                }
            }
            if(!ok){
                cout<<"0"<<endl;
                continue;
            }
            queue<int> q;
            for(int i=0;i<26;i++){
                if(in[i]==0) q.push(i);
            }
            vector<int> res;
            while(!q.empty()){
                int u = q.front();
                q.pop();
                res.push_back(u);
                for(int v=0;v<26;v++){
                    if(g[u][v]){
                        in[v]--;
                        if(in[v]==0) q.push(v);
                    }
                }
            }
            for(int i=0;i<26;i++){
                if(in[i]>0){
                    ok=false;
                    break;
                }
            }
            if(!ok){
                cout<<"0"<<endl;
                continue;
            }
            string t;
            for(auto s:strs) t += s;
            string sorted_t = t;
            sort(sorted_t.begin(), sorted_t.end());
            if(t == sorted_t){
                cout<<"1"<<endl;
            }else{
                bool flag = true;
                for(int i=0;i<t.size()-1&&flag;i++){
                    if(t[i]>t[i+1]) flag=false;
                }
                cout<<(flag?"1":"0")<<endl;
            }
        }
        return 0;
    }
    //:)
    //114514
    
    

    你们的有我"简洁吗"

    信息

    ID
    3246
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    81
    已通过
    26
    上传者