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

题面

HDU

Vjudge

题解

啊哈?什么垃圾一眼点分治+Hash判断,哈哈哈哈哈,让我来码码码。

诶,怎么WA了。改改改改改。

诶,怎么很对啊,去网上蒯一个标程来拍拍拍。

诶,怎么拍不WA啊,让我来人工检测一波啊哈哈哈哈。

感觉没有问题啊?诶,我换个方式来拍把,把字符集设小点就好了。

诶,WA不了,诶诶诶诶,WA了。

WOC,数据1w让我怎么手玩。

不管了,先把剪枝删掉再试试,诶诶诶,怎么答案对了?

我之前交不加剪枝的不是TLE了吗?

诶诶诶,WOC,怎么过了,哈哈哈哈哈,果然是傻逼点分治+Hash题。

诶,怎么,,,,怎么我的晚自习就没了呢?我怎么哭了?诶诶诶诶?

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<vector>
  8. #include<set>
  9. using namespace std;
  10. #define MAX 10010
  11. #define ull unsigned long long
  12. const int base=19260817;
  13. inline int read()
  14. {
  15. int x=0;bool t=false;char ch=getchar();
  16. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  17. if(ch=='-')t=true,ch=getchar();
  18. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  19. return t?-x:x;
  20. }
  21. struct Line{int v,next;}e[MAX<<1];
  22. int h[MAX],cnt=1;
  23. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
  24. int n;
  25. int size[MAX],Size,mx,root;
  26. bool vis[MAX];
  27. void getroot(int u,int ff)
  28. {
  29. size[u]=1;int ret=0;
  30. for(int i=h[u];i;i=e[i].next)
  31. {
  32. int v=e[i].v;if(v==ff||vis[v])continue;
  33. getroot(v,u);size[u]+=size[v];
  34. ret=max(ret,size[v]);
  35. }
  36. ret=max(ret,Size-size[u]);
  37. if(ret<mx)mx=ret,root=u;
  38. }
  39. int len;
  40. char ch[MAX],s[MAX];
  41. ull hs[MAX],pw[MAX];
  42. set<int> S1,S2;
  43. bool ans;
  44. ull get(int l,int r){return hs[r]-hs[l-1]*pw[r-l+1];}
  45. void calc(int u,int ff,int dep,ull h1,ull h2)
  46. {
  47. if(ans)return;if(dep>=len)return;
  48. h1=h1*base+ch[u];h2=h2+pw[dep]*ch[u];
  49. if(dep+1==len&&h1==get(1,len)){ans=true;return;}
  50. if(h1==get(len-dep,len)&&S2.count(len-dep-1)){ans=true;return;}
  51. if(h2==get(1,dep+1)&&S1.count(dep+2)){ans=true;return;}
  52. for(int i=h[u];i;i=e[i].next)
  53. if(!vis[e[i].v]&&e[i].v!=ff)
  54. calc(e[i].v,u,dep+1,h1,h2);
  55. }
  56. void insert(int u,int ff,int dep,ull h1,ull h2)
  57. {
  58. if(ans)return;if(dep>=len)return;
  59. h1=h1*base+ch[u];h2=h2+pw[dep]*ch[u];
  60. if(h1==get(len-dep,len))S1.insert(len-dep);
  61. if(h2==get(1,dep+1))S2.insert(dep+1);
  62. for(int i=h[u];i;i=e[i].next)
  63. if(!vis[e[i].v]&&e[i].v!=ff)
  64. insert(e[i].v,u,dep+1,h1,h2);
  65. }
  66. void Divide(int u)
  67. {
  68. if(ans)return;vis[u]=true;
  69. S1.clear();S2.clear();
  70. if(ch[u]==s[1])S2.insert(1);
  71. if(ch[u]==s[len])S1.insert(len);
  72. if(len==1&&ch[u]==s[1]){ans=true;return;}
  73. for(int i=h[u];i;i=e[i].next)
  74. {
  75. int v=e[i].v;if(vis[v])continue;
  76. calc(v,u,0,0,0);insert(v,u,1,ch[u],ch[u]);
  77. }
  78. for(int i=h[u];i;i=e[i].next)
  79. {
  80. int v=e[i].v;if(vis[v])continue;
  81. Size=mx=size[v];getroot(v,u);
  82. Divide(root);
  83. }
  84. }
  85. int main()
  86. {
  87. pw[0]=1;for(int i=1;i<MAX;++i)pw[i]=pw[i-1]*base;
  88. int T=read();
  89. for(int TT=1;TT<=T;++TT)
  90. {
  91. n=read();cnt=1;memset(h,0,sizeof(h));
  92. memset(vis,0,sizeof(vis));
  93. for(int i=1;i<n;++i)
  94. {
  95. int u=read(),v=read();
  96. Add(u,v);Add(v,u);
  97. }
  98. scanf("%s",ch+1);scanf("%s",s+1);len=strlen(s+1);
  99. memset(hs,0,sizeof(hs));
  100. for(int i=1;i<=len;++i)hs[i]=hs[i-1]*base+s[i];
  101. ans=false;Size=mx=n;getroot(1,0);
  102. Divide(root);
  103. printf("Case #%d: ",TT);
  104. ans?puts("Find"):puts("Impossible");
  105. }
  106. return 0;
  107. }

【HDU5469】Antonidas(点分治,字符串哈希)的更多相关文章

  1. HDU5469 Antonidas(树分治&&哈希)

    给你一颗点上有字符的树,问一个给定的字符串是否是这棵树上的两点的路径. 树分治的思想就是每次找重心,重心下的子问题分解去做,然后就是合并了.合并的时候用一个总的set<pair<len,h ...

  2. hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)

    题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...

  3. HDU 1880 魔咒词典(字符串哈希)

    题目链接 Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一 ...

  4. 洛谷P3370 【模板】字符串哈希

    P3370 [模板]字符串哈希 143通过 483提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 看不出来,这题哪里是哈希了- 题目描述 如题,给定N个字符串(第i个 ...

  5. HDU2594 Simpsons’ Hidden Talents 字符串哈希

    最近在学习字符串的知识,在字符串上我跟大一的时候是没什么区别的,所以恶补了很多基础的算法,今天补了一下字符串哈希,看的是大一新生的课件学的,以前觉得字符串哈希无非就是跟普通的哈希没什么区别,倒也没觉得 ...

  6. LA 6047 Perfect Matching 字符串哈希

    一开始我用的Trie+计数,但是不是计多了就是计少了,后来暴力暴过去的…… 看了别人的代码知道是字符串哈希,但是仍有几个地方不理解: 1.26^500溢出问题 2.没考虑哈希碰撞? 跪求指点! #in ...

  7. AC日记——【模板】字符串哈希 洛谷 3370

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转 ...

  8. 从Hash Killer I、II、III论字符串哈希

    首先,Hash Killer I.II.III是BZOJ上面三道很经典的字符串哈希破解题.当时关于II,本人还琢磨了好久,但一直不明白为啥别人AC的代码都才0.3kb左右,直到CYG神犇说可以直接随机 ...

  9. 【NOIP模拟】Grid(字符串哈希)

    题目背景 SOURCE:NOIP2016-RZZ-1 T3 题目描述 有一个 2×N 的矩阵,矩阵的每个位置上都是一个英文小写字符. 现在需要从某一个位置开始,每次可以移动到一个没有到过的相邻位置,即 ...

随机推荐

  1. Jenkins服务器维护

    Jenkins服务器维护 以下是一些基本的活动,一些是对 Jenkins 服务器维护的最佳实践 URL选项 在 Jenkins 实例 URL 有以下命令将开展对Jenkins实例的相关动作. http ...

  2. python游戏编程——乌龟和鱼类场景编程

    综合举例: 游戏编程:按以下要求定义一个乌龟类和鱼类并尝试编写游戏. O    假设游戏场景为范围(x, y)为0<=x<=10,0<=y<=10 ·       游戏生成1只 ...

  3. Shader Variants 打包遇到的问题

    1. 遇到的问题 最常见的是打包到手机后效果与PC上不一致,具体情况比如: 光照贴图失效 雾失效 透明或者cutoff失效 以上首先需要检查的地方是Shader变体的编译设置 2. 超级着色器编译成N ...

  4. 刨根问底KVO原理

    介绍 KVO( NSKeyValueObserving )是一种监测对象属性值变化的观察者模式机制.其特点是无需事先修改被观察者代码,利用 runtime 实现运行中修改某一实例达到目的,保证了未侵入 ...

  5. GIT rebase讲解

    对分支进行rebase 从master分支checkout出fork分支,并在master和fork上都进行了一些修改 现在fork分支想要及时的同步master分支上的修改,避免在已经失效的代码上继 ...

  6. MYSQL数据库与Emoji表情的故事

    问题背景 手机上众多输入法和键盘支持输入 emoji 表情,给早期设计的程序造成了越来越多的干扰. 移动端购物的流行,2018 年 "双十一"全网移动端交易达到 93.6% 微信年 ...

  7. Redis集群搭建与使用

    前端时间开发中需要用到redis缓存数据,考虑到单台redis的不稳定性,后采用redis集群的方式来实现,由于之前没有接触过,过程中也是踩了不少的坑,拖了三天总算是搞定了,最近公司比较闲,总结了一下 ...

  8. js中 null, undefined, 0,空字符串,false,不全等比较

    null == undefined // true null == ''  // false null == 0 // false null == false // false undefined = ...

  9. Django_信号

    目录 Django信号介绍 Django内置信号 信号种类 信号注册 自定义信号 实测 内置信号 自定义信号 Django信号介绍 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲 ...

  10. 微信公众号开发笔记1(nodejs开发)

    本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...