给定一棵 n 个点的树,树上每个节点代表一个小写字母,询问一个字符串 S 是否在树上出现过? 字符串 S 出现过即表示存在两个点 u,v,u 到 v 的最短路径上依次连接所有点上的字母恰好是 S

N ≤ 10^4

直接寻找即可,注意特殊情况,加一个小优化优化非常多。

 #include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<set>
#include<map>
#include<vector>
#include<time.h>
#define il inline
#define re register
using namespace std;
const int N=;
struct edge{int next,to;
} e[N];
int T,n,g[N][],M,m,d[N],x[N],y[N],exist[];
bool flag;
char p[N],q[N];
il void addedge(re int x,re int y){
e[++M]=(edge){g[x][p[y]-'a'],y};g[x][p[y]-'a']=M;
}
il bool dfs(re int h,re int fa,re int d){
//printf("%d %d %d\n",h,fa,d);
if(d==m){
return true;
}
for(re int i=g[h][q[d+]-'a'],k;i;i=e[i].next){
k=e[i].to;
if(k==fa) continue;
if(dfs(k,h,d+)) return true;
}
return false;
}
il bool dfs1(re int h,re int fa){
for(int j=;j<;j++){
for(int i=g[h][j];i;i=e[i].next){
if(e[i].to==fa) continue;
d[e[i].to]=d[h]+;
dfs1(e[i].to,h);
}
}
}
int main(){
freopen("alphabet.in","r",stdin);
freopen("alphabet.out","w",stdout);
scanf("%d",&T);
for(int it=;it<=T;it++){
memset(g,false,sizeof(g));
memset(exist,false,sizeof(exist));
scanf("%d",&n);M=;flag=true;
for(int i=;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
scanf("%s%s",p+,q+);m=strlen(q+);
for(int i=;i<=n;i++)
exist[p[i]-'a']++;
for(int i=;i<=m;i++)
if(!exist[q[i]-'a']){
flag=false;break;
}
if(!flag){
printf("Case #%d: Impossible\n",it);continue;
}
int t1=,t2=;
for(int i=;i<=n;i++){
if(p[i]==q[]) t1++;
if(p[i]==q[m]) t2++;
}
for(int i=;i<n;i++){
addedge(x[i],y[i]);
addedge(y[i],x[i]);
}
d[]=;dfs1(,);
int sp=;
for(int i=;i<=n;i++)
if(d[i]>d[sp]) sp=i;
d[sp]=;dfs1(sp,);
for(int i=;i<=n;i++)
if(d[i]>d[sp]) sp=i;
if(d[sp]<m){
printf("Case #%d: Impossible\n",it);continue;
}
if(t2<t1) reverse(q+,q+m+);
for(int i=;i<=n;i++){
if(p[i]==q[]){
if(dfs(i,,)){
printf("Case #%d: Find\n",it);flag=false;break;
}
}
}
if(flag){
printf("Case #%d: Impossible\n",it);
}
// cout<<clock()<<endl;
}
return ;
}

常州day1p4的更多相关文章

  1. [日常训练]常州集训day8

    T1 Description 给定一个长度为$n$的正整数序列$a$.可以将序列分成若干段,定义第$i$段的权值$x_i$为这一段中所有数的最大值,特殊地,$x_0=0$.求$\sum_{i=1}^{ ...

  2. [日常训练]常州集训day7

    T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...

  3. [日常训练]常州集训day5

    T1 Description 小$W$和小$M$一起玩拼图游戏啦~ 小$M$给小$M$一张$N$个点的图,有$M$条可选无向边,每条边有一个甜蜜值,小$W$要选$K$条边,使得任意两点间最多有一条路径 ...

  4. [日常训练]常州集训day3

    T1 Description 有$K$个石子,石子只能放在$N$条水平线与$M$条竖直线构成的网格的交点上. 求用$K$个石子最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子. ...

  5. [日常训练]常州集训day2

    T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...

  6. 常州Day4题解

    1. 高精度 这题略水,字符串可过,还不加压位等,操作只有BitShift和add/sub,不过编程复杂度有些高.(输出都是二进制我能说些什么...) 2. N皇后问题 (警告! 不是平时你见到的N皇 ...

  7. 常州培训 day5 解题报告

    第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程 ...

  8. 常州培训 day7 解题报告

    最后一天..有些感慨,这七天被虐的感动万分 第一题: 题目大意: 求出 n*i(i=1,2,3....n) mod p的逆元  n<p<=3000000 ,p是质数. 之前写过了,懒得再写 ...

  9. 常州培训 day6 解题报告

    第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1, ...

随机推荐

  1. QQ在线交谈一句代码搞定

    现在有很多网页都有QQ在线咨询,还有什么QQ客服什么的,看着很高大上的一个功能,其实要实现很简单,只需要一句代码就搞定. 还是按以前的套路,先看效果图,再晒源代码 点击图标 再点击 就可以聊天了 再来 ...

  2. 我们一起学习WCF 第十篇Wcf中实现事务

    数据一致性在工作中显得非常重要,有时候我们库中出现脏数据导致程序报错,但是又很难发现这样的错误,所以为了数据的完整性建议在程序中加入事物. 什么是事物:我们都有团队合作吧,比喻团队有3个人,a负责设计 ...

  3. NLP的12条精髓

    NLP是神经语言程序学 (Neuro-Linguistic Programming) 的英文缩写.一.没有两个人是一样的 No two persons are the same. 1.没有两个人的人生 ...

  4. Intellij IDEA破解激活

    本文使用破解补丁激活Intellij IDEA 第一步:下载破解补丁(http://idea.lanyus.com/) 第二步:将下载好的补丁放置磁盘的任意位置,下面是我放置的位置 第三步:打开Int ...

  5. 用Python实现检测视频真伪?

    译者注:本文以一段自打24小时耳光的视频为例子,介绍了如何利用均值哈希算法来检查重复视频帧.以下是译文. 有人在网上上传了一段视频,他打了自己24个小时的耳光.他真的这么做了吗?看都不用看,肯定没有! ...

  6. Zabbix远程执行命令

    原文发表于cu:2016-06-14 Zabbix触发器(trigger)达到阀值后会有动作(action)执行:发送告警信息或执行远程命令. 本文主要配置验证zabbix执行远程命令. 一.环境 S ...

  7. 【python 3.6】如何将list存入txt后,再读出list

    今天遇到一个需求,就是将一个list文件读取后,存入一个txt配置文件.存入时,发现list文件无法直接存入,必须转为str模式. 但在读取txt时,就无法恢复成list类型来读取了(准确地说,即使强 ...

  8. PCA(主成分析)

    PCA通过将高维空间向量映射到低维,对于数据进行处理

  9. java 乐观锁 vs 悲观锁

    在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 悲观锁其实就是 完全同步 比如 sync ...

  10. 王者荣耀交流协会final发布版本控制报告

    二次开发软件说明文档 Dec 6 纠正饼状图点击选择PSP文件无效. 添加饼状图丢失的代码. submit the files that last night I forgot. add shurum ...