前缀单词

    科技2022-07-14  131

    题目链接:前缀单词


    按照Trie建树,我们可以发现儿子和祖先关系是不能同时选取的。

    然后树形dp即可。


    AC代码:

    #pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> #define int long long using namespace std; const int N=60,M=N*N; int n,ch[M][26],ed[M],idx,dp[M]; char str[N]; vector<int> g[M]; inline void insert(){ int p=0; for(int i=1;str[i];i++){ int k=str[i]-'a'; if(!ch[p][k]) ch[p][k]=++idx; p=ch[p][k]; } ed[p]=1; } void dfs1(int x,int fa){ if(ed[x]) g[fa].push_back(x); for(int i=0;i<26;i++) if(ch[x][i]){ if(ed[x]) dfs1(ch[x][i],x); else dfs1(ch[x][i],fa); } } void dfs2(int x){ dp[x]=1; for(int to:g[x]) dfs2(to),dp[x]*=(dp[to]+1); } signed main(){ cin>>n; for(int i=1;i<=n;i++) scanf("%s",str+1),insert(); dfs1(0,0); dfs2(0); cout<<dp[0]; return 0; }
    Processed: 0.014, SQL: 8