http://codeforces.com/gym/100962/attachments

题意:有一个n个节点的字母树,给出n-1条边的信息,代表边上有一个字母,然后给出长度为m的字符串,问是否能在这棵树上找到这样一个序列等于这条字符串,输出序列的起点和终点。

思路:用DP数组维护当到达该结点的时候,左边最长的长度是多少和达到这个长度的左端点,右边最长的长度是多少和达到这个长度的右端点。详细看代码,很容易懂。

 #include <bits/stdc++.h>
using namespace std;
#define N 500010
struct Edge {
int v, nxt; char c;
} edge[N*];
struct node {
int l, r, ansl, ansr;
} dp[N]; // l是保存头,r是保存尾的信息
int tot, head[N], n, m, ansu, ansv;
char s[N]; void Add(int u, int v, char c) {
edge[tot] = (Edge) {v, head[u], c}; head[u] = tot++;
edge[tot] = (Edge) {u, head[v], c}; head[v] = tot++;
} bool dfs(int u, int fa) {
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].v; char c = edge[i].c;
if(v == fa) continue;
if(dfs(v, u)) return true; // 已经有答案了
int ltmp = dp[v].l;
int rtmp = dp[v].r;
if(c == s[dp[v].l]) ltmp++; // 如果当前的边是左边的下一个字符
if(c == s[m - dp[v].r - ]) rtmp++; // 如果当前的边是右边的下一个字符
if(ltmp + dp[u].r >= m) { // 有答案了
ansu = dp[v].ansl, ansv = dp[u].ansr;
return true;
}
if(dp[u].l + rtmp >= m) {
ansu = dp[u].ansl, ansv = dp[v].ansr;
return true;
}
if(ltmp > dp[u].l) { // 如果长度变长就更新
dp[u].ansl = dp[v].ansl;
dp[u].l = ltmp;
}
if(rtmp > dp[u].r) {
dp[u].ansr = dp[v].ansr;
dp[u].r = rtmp;
}
}
return false;
} int main() {
scanf("%d%d", &n, &m);
tot = ; memset(head, -, sizeof(head));
for(int i = ; i < n; i++) {
int u, v; char c;
cin >> u >> v >> c;
Add(u, v, c);
dp[i].l = dp[i].r = ; // 点的信息
dp[i].ansl = dp[i].ansr = i; // 端点答案的信息
}
dp[n].l = dp[n].r = ;
dp[n].ansl = dp[n].ansr = n;
cin >> s;
ansu = ansv = -;
dfs(, -);
printf("%d %d\n", ansu, ansv);
return ;
}

Codeforces Gym100962J:Jimi Hendrix(树型DP)的更多相关文章

  1. Codeforces 23E Tree(树型DP)

    题目链接 Tree $dp[x][i]$表示以x为根的子树中x所属的连通快大小为i的时候 答案最大值 用$dp[x][j]$ * $dp[y][k]$ 来更新$dp[x][j + k]$. (听高手说 ...

  2. Codeforces 581F Zublicanes and Mumocrates(树型DP)

    题目链接  Round 322 Problem F 题意  给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...

  3. Codeforces 149D Coloring Brackets(树型DP)

    题目链接 Coloring Brackets 考虑树型DP.(我参考了Q巨的代码还是略不理解……) 首先在序列的最外面加一对括号.预处理出DFS树. 每个点有9中状态.假设0位不涂色,1为涂红色,2为 ...

  4. 【题解】codeforces 219D Choosing Capital for Treeland 树型dp

    题目描述 Treeland国有n个城市,这n个城市连成了一颗树,有n-1条道路连接了所有城市.每条道路只能单向通行.现在政府需要决定选择哪个城市为首都.假如城市i成为了首都,那么为了使首都能到达任意一 ...

  5. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  6. POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断

    好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...

  7. 【XSY1905】【XSY2761】新访问计划 二分 树型DP

    题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...

  8. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  9. 【POJ 3140】 Contestants Division(树型dp)

    id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS   Memory Limit: 65536K Tot ...

  10. ZOJ 3949 (17th 浙大校赛 B题,树型DP)

    题目链接  The 17th Zhejiang University Programming Contest Problem B 题意  给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...

随机推荐

  1. Harden the Hacker Thinking (Updating)

    录制自己的最新思考harden过程.通过记录,反射,加强管理,发现缺陷. 等一下design,等一下coding,三十分钟rethinking. 2015-02-26 : 不要在一件事上停留太久: 歇 ...

  2. WPF滚动条嵌套,响应鼠标滑轮事件的处理

    在C# 中,两个ScrollViewer嵌套在一起或者ScrollViewer里面嵌套一个ListBox.Listview(控件本身有scrollviewer)的时候,我们本想要的效果是鼠标滚动整个S ...

  3. 如何设置程序UAC控制

    在做项目的过程中,有很多情况会涉及到权限问题,要求必须以管理员的身份才能运行,如何强制我们的程序必须以管理员身份运行呢?在调查的过程中发现有很多方式,此处介绍一种简单的方式. 1.在VS中,右键点击工 ...

  4. Delphi7下安装TMS component控件

    1.启动delphi7.2.File-->Open Project ...打开TMS component 源目录下的“tmsd7.bpg”. 3.在打开的窗口列表中,依次在各选项上点击鼠标右键, ...

  5. SQL Server 数据库所有表增加同一列

    SET @COLUMN_NAME = 'ColumnNameYouWantToAdd'; SET @COLUMN_DATATYPE = 'DataTypeOfColumn'; ------------ ...

  6. scala 学习

    继续学习: https://segmentfault.com/a/1190000003068853#articleHeader2 https://docs.scala-lang.org/tour/mi ...

  7. 【redis】redis的bind配置

    原文:[redis]redis的bind配置   在配置文件redis.conf中,默认的bind 接口是127.0.0.1,也就是本地回环地址.这样的话,访问redis服务只能通过本机的客户端连接, ...

  8. Android零基础入门第39节:ListActivity和自定义列表项

    原文:Android零基础入门第39节:ListActivity和自定义列表项 相信通过前两期的学习,以及会开发最简单的一些列表界面了吧,那么本期接着来学习更多方法技巧. 一.使用ListActivi ...

  9. UWP入门(五)--控件模板

    原文:UWP入门(五)--控件模板 通过在 XAML 框架中创建控件模板,你可以自定义控件的可视结构和可视行为(eg:勾选框的三种状态). 控件有多个属性,如 Background.Foregroun ...

  10. 智能合约开发——以太坊 DApp 实现 购买通证token

    合约的buy()方法用于提供购买股票的接口.注意关键字payable,有了它买股票的人才可以付钱给你. 接收钱没有比这个再简单的了! function buy() payable public ret ...