样例没过求调
查看原帖
样例没过求调
658786
STUDENT00楼主2022/11/1 18:22

模板Trie,结果样例没过。。。。。。

#include<bits/stdc++.h>
using namespace std;
int n,cnt;
string str[30010];
set<string> st;
int nxt[300010][26];
bool vis[300010],a[26][26];
void inser(string s){
    int p=0;
    for(int i=0;i<s.length();i++){   
        int c=s[i]-'a';
        if(!nxt[p][c]) nxt[p][c]=++cnt;
        p=nxt[p][c];
    }
    vis[p]=1;
}
void dfs(int now,string go){
    if(vis[now]) st.insert(go);
    else{
        for(int i=0;i<26;i++){
            if(nxt[now][i]){
                bool flag=0;
                for(int j=0;j<26;j++){
                    if(i!=j&&nxt[now][j]&&a[j][i]){
                        flag=1;
                        break;
                    }
                }
                if(flag) continue;
                for(int j=0;j<26;j++){
                    if(i!=j&&nxt[now][j]) a[i][j]=1;
                }
                dfs(nxt[now][i],go+char(i+'a'));
                for(int j=0;j<26;j++){
                    if(i!=j&&nxt[now][j]) a[i][j]=0;
                }
            }
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>str[i];
        inser(str[i]);
    }
    dfs(0,"");
    printf("%d\n",st.size());
    for(int i=1;i<=n;i++){
        if(st.count(str[i])) cout<<str[i]<<endl;
    }
    return 0;
}
2022/11/1 18:22
加载中...