题目链接:hdu 5469 Antonidas

题意:

给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S。

题解:

这题可以用树的分治+字符串hash,不过搜索+剪枝写的好一样可以过,而且跑的时间和正解差不多。

搜索的做法就是先随便找一个点当作根,然后预处理一下最大的深度,然后枚举起点,开始向各个方向遍历,如果这个点的最大深度小于未匹配的字符串长度,那么久向父亲方面搜。

  1. #include<bits/stdc++.h>
  2. #define F(i,a,b) for(int i=a;i<=b;i++)
  3. using namespace std;
  4. const int N=1e4+;
  5.  
  6. int t,n,g[N],v[N*],nxt[N*],ed,fg,ic,len,dep[N],mxdep[N],vis[N],fa[N];
  7. char str[N],S[N];
  8.  
  9. inline void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
  10. inline void up(int &a,int b){if(a<b)a=b;}
  11.  
  12. void init_dfs(int u)
  13. {
  14. int ma=-N;
  15. mxdep[u]=,vis[u]=;
  16. for(int x=g[u];x;x=nxt[x])if(!vis[v[x]])
  17. {
  18. init_dfs(v[x]);
  19. up(ma,mxdep[v[x]]);
  20. fa[v[x]]=u;
  21. }
  22. mxdep[u]=(ma==-N?:ma+);
  23. }
  24.  
  25. void dfs_find(int u,int now)
  26. {
  27. if(fg)return;
  28. if(now==len){fg=;return;}
  29. if(mxdep[u]>len-now)
  30. {
  31. for(int i=g[u];i;i=nxt[i])
  32. if(str[v[i]]==S[now+]&&!vis[v[i]])
  33. vis[v[i]]=,dfs_find(v[i],now+),vis[v[i]]=;
  34. }
  35. else if(str[fa[u]]==S[now+]&&!vis[fa[u]])
  36. vis[fa[u]]=,dfs_find(fa[u],now+),vis[fa[u]]=;
  37. }
  38.  
  39. int main()
  40. {
  41. scanf("%d",&t);
  42. while(t--)
  43. {
  44. scanf("%d",&n);
  45. memset(g,,sizeof(g)),ed=;
  46. F(i,,n-)
  47. {
  48. int x,y;
  49. scanf("%d%d",&x,&y);
  50. adg(x,y),adg(y,x);
  51. }
  52. scanf("%s%s",str+,S+);
  53. len=strlen(S+);
  54. memset(vis,,sizeof(vis));
  55. init_dfs(),fg=;
  56. F(i,,n)if(str[i]==S[])
  57. {
  58. memset(vis,,sizeof(vis));
  59. vis[i]=,dfs_find(i,);
  60. }
  61. printf("Case #%d: %s\n",++ic,fg?"Find":"Impossible");
  62. }
  63. return ;
  64. }

hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)的更多相关文章

  1. HDU 5469 Antonidas

    Antonidas Time Limit: 4000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID:  ...

  2. hdu 5469 Antonidas (dfs+剪枝)2015 ACM/ICPC Asia Regional Shanghai Online

    题意: 给出一棵树,再给出每个节点上的值(一个char字符)这些值以一个字符串s1表示,然后给出一个s2字符串,问在这棵树上是否存在两个点,从一个点走到另一个点所经过的路径上的char字符组成的字符串 ...

  3. HDU 5469 Antonidas (树形DP,暴力)

    题意: 给一棵n节点的树图,每个点都是一个小写字母,要求找到两个点(a,b),从a->b的路径上形成了一个字符串为s.给出s,问是否存在这样的点对. 思路: 考虑一个点,要么从该点出发,要么在该 ...

  4. HDU 5235 Friends (2015 Multi-University Training Contest 2 搜索+剪枝)

    题目链接:pid=5305">传送门 题意: n个人给定m个关系.每一个关系为x,y表示x,y是朋友.可是可能是online friends,也可能是offline friends. ...

  5. 【HDU5469】Antonidas(点分治,字符串哈希)

    [HDU5469]Antonidas(点分治,字符串哈希) 题面 HDU Vjudge 题解 啊哈?什么垃圾一眼点分治+Hash判断,哈哈哈哈哈,让我来码码码. 诶,怎么WA了.改改改改改. 诶,怎么 ...

  6. hdu 4871 树的分治+最短路记录路径

    /* 题意:给你一些节点和一些边,求最短路径树上是k个节点的最长的路径数. 解:1.求出最短路径树--spfa加记录 2.树上进行操作--树的分治,分别处理子树进行补集等运算 */ #include& ...

  7. hdu 4670 树的分治-求点对的个数

    /* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成.现在定义任意任意两点的价值为他们路径上的权 ...

  8. hdu 3842 Machine Works(cdq分治维护凸壳)

    题目链接:hdu 3842 Machine Works 详细题解: HDU 3842 Machine Works cdq分治 斜率优化 细节比较多,好好体会一下. 在维护斜率的时候要考虑x1与x2是否 ...

  9. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

随机推荐

  1. 关于Two-Pass标记连通域个数

    关于Two-Pass标记连通域个数 背景 在完成图像的一系列处理后,得到二值图,一般会统计目标数量,即是获取连通域个数,这里采用TwoPass的方法. 基本思想 在Two-pass连通域标记中,第一次 ...

  2. Http中的Get/Post方法

    这篇文章源自http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是G ...

  3. Map - leetcode [哈希表]

    149. Max Points on a Line unordered_map<float, int> hash 记录的是斜率对应的点数 unordered_map<float, i ...

  4. iOS 发布项目到CocoaPods其实没那么复杂😆

    首先大家必须要了解一下CocoaPods (如果你连CocoaPods是啥都不知道可以不用往下看了

  5. RTMP直播应用与延时分析

    直播应用中,RTMP和HLS基本上可以覆盖所有客户端观看,HLS主要是延时比较大,RTMP主要优势在于延时低. 一.应用场景 低延时应用场景包括:  .  互动式直播:譬如2013年大行其道的美女主播 ...

  6. mouseover和this的巧用

    mouseover & mouseout 的问题 在JS中,使用mouseover & mouseout会有触发多次的问题,这里Jquery有了替代的新属性 mouseover == ...

  7. Java NIO Channel之FileChannel [ 转载 ]

    Java NIO Channel之FileChannel [ 转载 ] @author zachary.guo 对于文件 I/O,最强大之处在于异步 I/O(asynchronous I/O),它允许 ...

  8. error C3872: “0x3000”: 此字符不允许在标识符中使用

    主要是拷贝的程序问题,有错误的空字符. 0x3000是汉语的空格,也就是全角空格,相当于一个汉字,但你又看不见它. 你知道的,像逗号,有半角(,)和全角(,)之分的,其实空格也有. 0x3000是全角 ...

  9. 窗口、easyui-window、easyui-panel、easyui-linkbutton

    //窗口 <script type="text/javascript" src="js/jquery.min.js"></script> ...

  10. JQuery 模糊匹配

    [属性名称]         匹配包含给定属性的元素 [att=value]       匹配包含给定属性的元素      [att*=value]     模糊匹配      [att!=value ...