1 条题解
-
2
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; #define N 510050 #define M 100050 #define ll long long ll ans=0; char x[N]; int n,cnt,bo[N],tot=1,trie[5000050][27],fa[N],id[N],son[N],num; vector<int>tu[N]; int read() { int s=0,p=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-')p=-1; ch=getchar(); } while(ch>='0' && ch<='9') { s=(s<<1)+(s<<3)+(ch^48); ch=getchar(); } return s*p; } int find(int x) { if(fa[x]==x)return fa[x]; else return fa[x]=find(fa[x]); } void insert(char *s,int bh) { int l=strlen(s); int u=1; for(int i=l-1;i>=0;i--) { int c=s[i]-'a'; if(!trie[u][c])trie[u][c]=++tot; u=trie[u][c]; } bo[u]=bh; } void make(int x) { for(int i=0;i<26;i++) { int v=trie[x][i]; if(v) { if(!bo[v]) { fa[v]=find(x); } else { tu[bo[find(x)]].push_back(bo[v]); } make(v); } } } int cmp(int x,int y) { return son[x]<son[y]; } void sonsum(int x) { son[x]=1; for(vector<int> :: iterator it=tu[x].begin();it!=tu[x].end();it++) { int v=*it; sonsum(v); son[x]+=son[v]; } sort(tu[x].begin(),tu[x].end(),cmp); } void dfs(int x) { id[x]=num++; for(vector<int> :: iterator it=tu[x].begin();it!=tu[x].end();it++) { int v=*it; ans+=num-id[x]; dfs(v); } } void dfss(int x) { for(vector<int> :: iterator it=tu[x].begin();it!=tu[x].end();it++) { int v=*it; cout<<v<<endl; dfss(v); } } int main() { n=read(); for(int i=1;i<=n;i++) { scanf("%s",x); insert(x,i); } for(int i=1;i<=tot;i++)fa[i]=i; make(1); sonsum(0);dfs(0); printf("%lld",ans); return 0; }
- 1
信息
- ID
- 211
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者