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. XF 标签和文本控件

    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...

  2. js table鼠标点击时变色

    <head>    <title></title>    <script type="text/javascript">      ...

  3. 通通玩blend美工(3)——可爱的云

    原文:通通玩blend美工(3)--可爱的云 好久没有写这个系列的博客了,这里给个电梯吧,照顾新来的同学~~ 通通玩blend美工(1)——荧光Button 通通玩blend美工(2)——时钟 目前我 ...

  4. SyncML是一平台无关的信息同步标准协议集

    SyncML (Synchronization Markup Language)是一平台无关的信息同步标准协议集.分为SyncML数据传输协议(SyncML-DS)和SyncML设备管理协议(Sync ...

  5. JQuery 判断checkbox是否选中,checkbox全选,获取checkbox选中值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 图像滤镜艺术---微软自拍APP滤镜实现合集DEMO

    原文:图像滤镜艺术---微软自拍APP滤镜实现合集DEMO 微软最近推出了自家的美颜app,大家有兴趣可以在苹果商店中下载一下看一看,今天,我们要说的便是这款app中的所有滤镜实现问题. 这款app中 ...

  7. Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...

  8. Win8Metro(C#)数字图像处理--2.11图像锐化

    原文:Win8Metro(C#)数字图像处理--2.11图像锐化  [函数名称] 图像锐化函数SharpeningProcess(WriteableBitmap src,double sharpe ...

  9. Python杂谈: 集合中union和update的区别(Python3.x)

    集合中union和update方法都是将多个可迭代的对象合并,但是返回的结果和对初始对象的影响却不一样 # union() 方法 - a.union(b) 将集合a和集合b取并集,并将并集作为一个新的 ...

  10. 给变量赋值,程序会跳到 HardFault_Handler的问题

    原因:变量属于指针,该指针没有初始化