bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡
2015-11-23 16:08
351 查看
资瓷点此阅读QvQ
Descripiton
给定一棵树,每个节点有一个字符,求从一个节点出发沿最短路径走到另一个节点所构成的字符串一共有多少种注意:叶子数≤\le20
Solution
这个题,发现叶子数很少就很好做了,以每个叶子为根节点建立SAM即可,这样原树上所有路径都在SAM出现过,统计即可。Code
#include <bits/stdc++.h> using namespace std; const int N = 100005 * 2 * 20, M = 10; typedef long long LL; #define pb push_back struct SAM { int tot, last, step , g , par , son [M], cnt , Q , ch , f ; void init() { tot = 0; memset(par, 0, sizeof(par)); par[0] = -1; memset(son, 0, sizeof(son)); } int add(int last, int x) { int p = last, np = ++tot; step[np] = step[p] + 1, last = np, ++g[np];//right ch[np] = x; for (; !son[p][x] && ~p; p = par[p]) son[p][x] = np; if (p == -1) return np; int q = son[p][x]; if (step[q] == step[p] + 1) par[np] = q; else { step[++tot] = step[p] + 1; ch[tot] = x; int nq = tot; memcpy(son[nq], son[q], sizeof(son[q])); par[nq] = par[q]; par[np] = par[q] = nq; for (; son[p][x] == q && ~p; p = par[p]) son[p][x] = nq; } return np; } void topo() { for (int i = 1; i <= tot; ++i) ++cnt[step[i]]; for (int i = 1; i <= tot; ++i) cnt[i] += cnt[i - 1]; for (int i = 1; i <= tot; ++i) Q[cnt[step[i]]--] = i; } LL gao() { LL ans = 0; for (int i = 1; i <= tot; ++i) ans += step[i] - step[par[i]];//i状态表示多少个字符串 return ans; } }S; int a[100005], d[100005]; vector<int> g[100005]; void dfs(int u, int fa, int last) { int t = S.add(last, a[u]); for (int i = 0; i < g[u].size(); ++i) { int v = g[u][i]; if (v == fa) continue; dfs(v, u, t); } } int main() { S.init(); int n, c; scanf("%d%d", &n, &c); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1, u, v; i < n; ++i) { scanf("%d%d", &u, &v); g[u].pb(v), g[v].pb(u); ++d[u], ++d[v]; } for (int i = 1; i <= n; ++i) if (d[i] == 1) dfs(i, 0, 0); printf("%lld\n", S.gao()); return 0; }
相关文章推荐
- 用redis做超时判断 感觉写的很有意思
- DOCTYPE、指定语言、字符集
- elipse 报出An internal error occurred during: "C/C++ Indexer". java.lang.NullPointerExcption 错误
- oracle 日志文件组六种状态
- 第十二周 项目4-利用遍历思想求解图问题(1)
- 第13周上机实践项目- 验证算法(1)Prim算法的验证
- android activity学习
- Jeecg平台扩展性不好的地方收集启动。
- 第十三周项目1-Prim算法验证
- bzoj 3998 [TJOI2015]弦论
- 利用第3方开源框架 Volley ,实现图片,网站源码的加载
- java+uiautomator 打包运行
- MSSQL 日期查询 包含NULL值
- Java中生成随机数的实现方法总结
- dom4j解析xml
- 统一建模UML
- myeclipse 上安装 Maven3
- Codeforces Round #332 (Div. 2) (A,B,C,D)
- jquery无限级联下拉菜单简单实例演示
- MySQL 存储过程之游标