博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
阅读量:5326 次
发布时间:2019-06-14

本文共 1538 字,大约阅读时间需要 5 分钟。

题目链接:

题意:

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

题解:

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

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

1 #include
2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 const int N=1e4+7; 5 6 int t,n,g[N],v[N*2],nxt[N*2],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
len-now)30 {31 for(int i=g[u];i;i=nxt[i])32 if(str[v[i]]==S[now+1]&&!vis[v[i]])33 vis[v[i]]=1,dfs_find(v[i],now+1),vis[v[i]]=0;34 }35 else if(str[fa[u]]==S[now+1]&&!vis[fa[u]])36 vis[fa[u]]=1,dfs_find(fa[u],now+1),vis[fa[u]]=0;37 }38 39 int main()40 {41 scanf("%d",&t);42 while(t--)43 { 44 scanf("%d",&n);45 memset(g,0,sizeof(g)),ed=0;46 F(i,1,n-1)47 {48 int x,y;49 scanf("%d%d",&x,&y);50 adg(x,y),adg(y,x);51 }52 scanf("%s%s",str+1,S+1);53 len=strlen(S+1);54 memset(vis,0,sizeof(vis));55 init_dfs(1),fg=0;56 F(i,1,n)if(str[i]==S[1])57 {58 memset(vis,0,sizeof(vis));59 vis[i]=1,dfs_find(i,1);60 }61 printf("Case #%d: %s\n",++ic,fg?"Find":"Impossible");62 }63 return 0;64 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/6113754.html

你可能感兴趣的文章
高品质免费字体集锦:25款英文艺术字体下载
查看>>
linux服务器上使用find查杀webshell木马方法
查看>>
Unix/Linux环境C编程入门教程(17) Gentoo LinuxCCPP开发环境搭建
查看>>
基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
查看>>
k8s取节点内docker中的日志
查看>>
turtle库基础练习
查看>>
SVM-笔记(1)
查看>>
android"百码"2——基础小知识积累(逐步完善)2015-06-15
查看>>
如鹏网学习笔记(四).Net常用类库
查看>>
IE浏览器解决margin:0 auto;不居中办法!
查看>>
解决响应式布局下兼容性的问题
查看>>
Jsp页面跳转和js控制页面跳转的几种方法
查看>>
京东静态网页练习记录
查看>>
Filebeat Config 参数详解:
查看>>
CCActionManager(动作管理器)
查看>>
使用DBCP连接池对连接进行管理
查看>>
C# winform 右下角弹出窗口效果
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
(转)大型网站架构演变和知识体系
查看>>
中级web前端面试题1
查看>>