BZOJ 4567: [Scoi2016]背单词
2016-05-23 19:21
435 查看
显然第一种情况可以避免
将每个串都看成树上的一个节点,父亲为它的后缀串中最长的那个
这棵树可以通过每个串reverse后加入Trie树中,最后去掉Trie树的虚节点来获得
于是问题变成了给树上每个点标号,使得每个点的标号减去它父亲的标号的和最小
显然要按DFS序标号
考虑相邻的兄弟节点u,v
先u再v比先v再u的答案大siz[u]-siz[v]
所以子节点按子树大小排序后依次标号即可
将每个串都看成树上的一个节点,父亲为它的后缀串中最长的那个
这棵树可以通过每个串reverse后加入Trie树中,最后去掉Trie树的虚节点来获得
于是问题变成了给树上每个点标号,使得每个点的标号减去它父亲的标号的和最小
显然要按DFS序标号
考虑相邻的兄弟节点u,v
先u再v比先v再u的答案大siz[u]-siz[v]
所以子节点按子树大小排序后依次标号即可
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<algorithm> #include<map> #include<set> #include<stack> #define rep(i,l,r) for(int i=l;i<=r;i++) #define per(i,r,l) for(int i=r;i>=l;i--) #define mmt(a,v) memset(a,v,sizeof(a)) #define tra(i,u) for(int i=head[u];i;i=e[i].next) using namespace std; typedef long long ll; const int N=510000+5; int ch [26],val ,sz; int siz ; vector<int>son ; void insert(char *s,int k){ int u=0,n=strlen(s+1); reverse(s+1,s+1+n); rep(i,1,n){ int c=s[i]-'a'; if(!ch[u][c])ch[u][c]=++sz; u=ch[u][c]; } val[u]=k; } void dfs(int u,int fa){ if(val[u])son[fa].push_back(val[u]),fa=val[u]; rep(i,0,25)if(ch[u][i])dfs(ch[u][i],fa); } bool cmp(int i,int j){return siz[i]>siz[j];} int dfs(int u){ siz[u]=1; per(i,(int)son[u].size()-1,0) siz[u]+=dfs(son[u][i]); sort(son[u].begin(),son[u].end(),cmp); return siz[u]; } int id; ll solve(int u,int fa){ ll ans=0; ans+=id-fa;fa=id++; per(i,(int)son[u].size()-1,0) ans+=solve(son[u][i],fa); return ans; } char s ; int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int n;scanf("%d",&n); rep(i,1,n)scanf("%s",s+1),insert(s,i); dfs(0,0); dfs(0); printf("%lld\n",solve(0,0)); return 0; }
相关文章推荐
- static初始化问题探究
- 锋利的jQuery之事件
- HDU 1754 I hate it 【单节点+最大值】
- Git+Andorid studio的使用 第二章 提交代码 可视化与Git命令
- Java获取某个日期前后几天日期
- JSP自定义标记
- 交换两个数
- I00015 打印等腰三角形字符图案(底边在上)
- 计算机原理
- 单例模式与线程安全
- 张小龙《微信背后的产品观》之PPT完整文字版
- 第六次JAVA作业
- 线段树飞机票
- 基于UDP协议的进程间通信
- HDU 2604 Queuing
- Android编程之SparseArray<E>详解
- hdu1028 Ignatius and the Princess III 递推
- 大臣的旅费____树的直径
- 正确理解ThreadLocal
- iOS开发-UIWebView加载本地和网络数据