【HDU5469】Antonidas(点分治,字符串哈希)
【HDU5469】Antonidas(点分治,字符串哈希)
题面
题解
啊哈?什么垃圾一眼点分治+Hash判断,哈哈哈哈哈,让我来码码码。
诶,怎么WA了。改改改改改。
诶,怎么很对啊,去网上蒯一个标程来拍拍拍。
诶,怎么拍不WA啊,让我来人工检测一波啊哈哈哈哈。
感觉没有问题啊?诶,我换个方式来拍把,把字符集设小点就好了。
诶,WA不了,诶诶诶诶,WA了。
WOC,数据1w让我怎么手玩。
不管了,先把剪枝删掉再试试,诶诶诶,怎么答案对了?
我之前交不加剪枝的不是TLE了吗?
诶诶诶,WOC,怎么过了,哈哈哈哈哈,果然是傻逼点分治+Hash题。
诶,怎么,,,,怎么我的晚自习就没了呢?我怎么哭了?诶诶诶诶?
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
#define MAX 10010
#define ull unsigned long long
const int base=19260817;
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int n;
int size[MAX],Size,mx,root;
bool vis[MAX];
void getroot(int u,int ff)
{
size[u]=1;int ret=0;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff||vis[v])continue;
getroot(v,u);size[u]+=size[v];
ret=max(ret,size[v]);
}
ret=max(ret,Size-size[u]);
if(ret<mx)mx=ret,root=u;
}
int len;
char ch[MAX],s[MAX];
ull hs[MAX],pw[MAX];
set<int> S1,S2;
bool ans;
ull get(int l,int r){return hs[r]-hs[l-1]*pw[r-l+1];}
void calc(int u,int ff,int dep,ull h1,ull h2)
{
if(ans)return;if(dep>=len)return;
h1=h1*base+ch[u];h2=h2+pw[dep]*ch[u];
if(dep+1==len&&h1==get(1,len)){ans=true;return;}
if(h1==get(len-dep,len)&&S2.count(len-dep-1)){ans=true;return;}
if(h2==get(1,dep+1)&&S1.count(dep+2)){ans=true;return;}
for(int i=h[u];i;i=e[i].next)
if(!vis[e[i].v]&&e[i].v!=ff)
calc(e[i].v,u,dep+1,h1,h2);
}
void insert(int u,int ff,int dep,ull h1,ull h2)
{
if(ans)return;if(dep>=len)return;
h1=h1*base+ch[u];h2=h2+pw[dep]*ch[u];
if(h1==get(len-dep,len))S1.insert(len-dep);
if(h2==get(1,dep+1))S2.insert(dep+1);
for(int i=h[u];i;i=e[i].next)
if(!vis[e[i].v]&&e[i].v!=ff)
insert(e[i].v,u,dep+1,h1,h2);
}
void Divide(int u)
{
if(ans)return;vis[u]=true;
S1.clear();S2.clear();
if(ch[u]==s[1])S2.insert(1);
if(ch[u]==s[len])S1.insert(len);
if(len==1&&ch[u]==s[1]){ans=true;return;}
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(vis[v])continue;
calc(v,u,0,0,0);insert(v,u,1,ch[u],ch[u]);
}
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(vis[v])continue;
Size=mx=size[v];getroot(v,u);
Divide(root);
}
}
int main()
{
pw[0]=1;for(int i=1;i<MAX;++i)pw[i]=pw[i-1]*base;
int T=read();
for(int TT=1;TT<=T;++TT)
{
n=read();cnt=1;memset(h,0,sizeof(h));
memset(vis,0,sizeof(vis));
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
scanf("%s",ch+1);scanf("%s",s+1);len=strlen(s+1);
memset(hs,0,sizeof(hs));
for(int i=1;i<=len;++i)hs[i]=hs[i-1]*base+s[i];
ans=false;Size=mx=n;getroot(1,0);
Divide(root);
printf("Case #%d: ",TT);
ans?puts("Find"):puts("Impossible");
}
return 0;
}
【HDU5469】Antonidas(点分治,字符串哈希)的更多相关文章
- HDU5469 Antonidas(树分治&&哈希)
给你一颗点上有字符的树,问一个给定的字符串是否是这棵树上的两点的路径. 树分治的思想就是每次找重心,重心下的子问题分解去做,然后就是合并了.合并的时候用一个总的set<pair<len,h ...
- hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...
- HDU 1880 魔咒词典(字符串哈希)
题目链接 Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一 ...
- 洛谷P3370 【模板】字符串哈希
P3370 [模板]字符串哈希 143通过 483提交 题目提供者HansBug 标签 难度普及- 提交 讨论 题解 最新讨论 看不出来,这题哪里是哈希了- 题目描述 如题,给定N个字符串(第i个 ...
- HDU2594 Simpsons’ Hidden Talents 字符串哈希
最近在学习字符串的知识,在字符串上我跟大一的时候是没什么区别的,所以恶补了很多基础的算法,今天补了一下字符串哈希,看的是大一新生的课件学的,以前觉得字符串哈希无非就是跟普通的哈希没什么区别,倒也没觉得 ...
- LA 6047 Perfect Matching 字符串哈希
一开始我用的Trie+计数,但是不是计多了就是计少了,后来暴力暴过去的…… 看了别人的代码知道是字符串哈希,但是仍有几个地方不理解: 1.26^500溢出问题 2.没考虑哈希碰撞? 跪求指点! #in ...
- AC日记——【模板】字符串哈希 洛谷 3370
题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转 ...
- 从Hash Killer I、II、III论字符串哈希
首先,Hash Killer I.II.III是BZOJ上面三道很经典的字符串哈希破解题.当时关于II,本人还琢磨了好久,但一直不明白为啥别人AC的代码都才0.3kb左右,直到CYG神犇说可以直接随机 ...
- 【NOIP模拟】Grid(字符串哈希)
题目背景 SOURCE:NOIP2016-RZZ-1 T3 题目描述 有一个 2×N 的矩阵,矩阵的每个位置上都是一个英文小写字符. 现在需要从某一个位置开始,每次可以移动到一个没有到过的相邻位置,即 ...
随机推荐
- SQL Server Management Studio 键盘快捷键
光标移动键盘快捷键 操作 SQL Server 2012 SQL Server 2008 R2 左移光标 向左键 向左键 右移光标 向右键 向右键 上移光标 向上键 向上键 下移光标 向下键 向下键 ...
- tomcat7时遇到启动报错问题 SEVERE: ContainerBase.addChild: start:
个人说明:错误日志确实是我的,方法都是从其他地儿借鉴过来的,但肯定是能解决错误的方法,亲身体验,安全保障!!! 还有遇到这种问题,多启动几遍可能就行了. 错误日志: SEVERE: Container ...
- HTML6的10个高级新特性
网络技术正趋向于发展为一个巨大的移动APP市场,在Web开发的革命浪潮中起着指示性作用,自HTML引入以来,应用程序变得So easy,web开发中运用先进技术也很容易处理各种复杂Bug. 作为专业的 ...
- max number of clients reached Redis测试环境报错
现象:测试服务是去redis循环取数据,早上发现服务挂了,手动登陆redis 无法输入命令,报错:max number of clients reached Redis
- 使用谷歌浏览器调试WEB前端的一些必备调试技巧
转载:http://www.techug.com/post/chrome-debug-tips.html Chrome的开发者工具是个很强大的东西,相信程序员们都不会陌生,不过有些小功能可能并不为大众 ...
- Scrum Meeting 11.11
成员 今日任务 明日计划 用时 徐越 学习UI设计并重构上传下载界面 赵庶宏 薄霖 UI代码更新 卞忠昊 Xfermode与PorterDuff 武鑫 界面设计:独 ...
- <!CDATA[]]用法详解
所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA PCDATA 指的是被解析的字符数据(Parsed Chara ...
- 灵悟礼品网上专卖店——第三阶段Sprint
一.小组成员: 洪雪意(产品负责人) 陈淑筠(Master) 二.组内人员任务情况 已完成的任务: 陈淑筠:主页面的设计 洪雪意:导航条的改进和页面中插入页面的功能 正在进行的任务: 陈淑筠:主页面的 ...
- 结对项目:四则运算web
1)Coding.Net项目地址 https://git.coding.net/DandelionClaw/WEB_Calculator.git 注:本项目为web端,并且需要连接SQL Server ...
- 小学四则运算结对项目报告(GUI)
小学四则运算结对项目报告(GUI) 一.Coding.Net项目地址: https://git.coding.net/wsshr/Calculation.git 二.PSP表格(完成前): PSP 任 ...