给定一棵 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. 我们一起学习WCF 第十篇Wcf中实现事务

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

  2. day05 字典 dict

    今日内容: 字典 成对的保存数据. 以key:value的形式保存 用{}表示,每一项内容都是key:value, 每项数据之间用逗号隔开 字典中的key是不能重复的. 存储是依靠着key来计算的. ...

  3. 用Tensorflow完成简单的线性回归模型

    思路:在数据上选择一条直线y=Wx+b,在这条直线上附件随机生成一些数据点如下图,让TensorFlow建立回归模型,去学习什么样的W和b能更好去拟合这些数据点. 1)随机生成1000个数据点,围绕在 ...

  4. Elasticsearch 统计代码例子

    aggs avg 平均数 最近15分钟的平均访问时间,upstream_time_ms是每次访问时间,单位毫秒 { "query": { "filtered": ...

  5. jupyter通过notedown使用markdown

    0 Problem 最近看了下李沐老师的mxnet教程,在使用jupyter的时候打开教程发现全是markdown源文,没有展示markdown格式的文字. 1 Reason 源代码是用markdow ...

  6. sprint3最终演示及团队贡献分

    团队名:在考虑 团队项目:复利计算 项目演示: 之前的功能都有演示过就不再一一截图,把我们新增加的功能说一下 首先用户进入我们的网页可以登录或者注册,注册的用户可以直接输入用户名及密码登录,没有注册的 ...

  7. Java连接池

  8. Scrum立会报告+燃尽图(Beta阶段第二周第五次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2413 项目地址:https://coding.net/u/wuyy694 ...

  9. Python:模块学习——sys模块

    sys模块常见函数和变量 sys.argv:命令行参数,实现从程序外部向程序传递参数 [注]:(1) sys.argv[0] 表示代码本身的文件路径 (2)sys.argv是一个元组,可以用[ ]提取 ...

  10. 第四周作业——C语言自评

    1.你对自己的未来有什么规划?做了哪些准备?以目前的现状来说,希望至少能够掌握专业所要求的基本操作,然后一步步去深入.提升,毕业之后不会灰溜溜的一次次求职失败.目前更多的是利用闲暇时间补回过去老师同学 ...