Codeforces Round #316 (Div. 2) D、E
Problem D:
题意:给定一棵n个点树,每个点有一个字母,有m个询问,每次询问某个节点x的子树中所有深度为k的点能否组成一个回文串
分析:一堆点能组成回文串当且仅当数量为奇数的字母不多于1个,显然这个状态可以用二进制表示
那么对于单个询问如何快速找到所有符合要求的点呢?
这里可以考虑树的dfs序,我们把深度相同的点按照dfs序加入集合中,易知在同一颗子树中的点肯定形成了一个连续的区间。
因此每次可以通过二分子树根节点的进入dfs序的时间和出dfs序的时间来找到这个区间
找到区间后可以根据预处理出的异或前缀和直接得到这个区间的二进制状态,再check一下即可
复杂度 n+m*(logn+26)
代码:
#include <bits/stdc++.h>
using namespace std;
vector<int>g[];
int a[];
char s[];
int in[];
int out[];
int n,m;
int t=;
struct node
{
int t,val;
bool operator <(const node &a)const
{
return t<a.t;
}
};
vector<node>ans[];
void dfs(int now,int d)
{
in[now]=++t;
ans[d].push_back(node{t,ans[d][ans[d].size()-].val^a[now]});
for(int i=;i<(int)g[now].size();i++)
{
int to=g[now][i];
dfs(to,d+);
}
out[now]=++t;
}
int main()
{
scanf("%d%d",&n,&m); for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
g[x].push_back(i);
} scanf("%s",s);
for(int i=;i<=n;i++)
{
a[i]=<<(s[i-]-'a');
ans[i].push_back(node{,});
}
dfs(,);
while(m--)
{
int p,x;
scanf("%d%d",&p,&x);
auto l=lower_bound(ans[x].begin(),ans[x].end(),node{in[p],});
auto r=upper_bound(ans[x].begin(),ans[x].end(),node{out[p],});
l--;
r--;
int st=((*l).val)^((*r).val);
int cnt=;
for(int i=;i<;i++)
{
if(st&(<<i))
cnt++;
}
if(cnt>)
{
puts("No");
}
else
{
puts("Yes");
}
}
return ;
}
Problem E:
题意:给一个n*m的棋盘,每个格子有一个字母,现在从1,1走到n,m,每次只能向右或者向下走,问走的路径上形成的字符串是回文串的方案书是多少
分析:从回文串的中点,即x+y=(n+m)/2的地方开始dp ,dp[i][j][k]存储当前回文长度为2*i ,左端点的x为i,右端点的x为j的回文串有多少个。
然后按照对角线递推即可。转移时注意必须满足左端点的x必须小于右端点,y必须大于右端点
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int dp[][][];
char s[][];
const int mod=1e9+;
int main()
{
scanf("%d%d",&n,&m);
for(int i=; i<n; i++)
{
scanf("%s",s[i]);
}
int ok=;
for(int i=(n+m)/-; i>=; i--)
{
memset(dp[i%],,sizeof(dp[i%]));
int j=n+m--i;
for(int x1=; x1<n; x1++)
{
int y1=i-x1;
if(y1<||y1>=m)
continue;
for(int x2=; x2<n; x2++)
{ int y2=j-x2;
if(y2<||y2>=m)
continue;
if(x1>x2||y1>y2)
continue;
if(s[x1][y1]==s[x2][y2])
{
if(ok==)
{
dp[i%][x1][x2]=;
continue;
}
for(int a=; a<; a++)
{
if(x1+a>=n)
continue;
for(int b=-; b<; b++)
{
if(x2+b<)
continue;
dp[i%][x1][x2]=(dp[i%][x1][x2]+dp[(i+)%][x1+a][x2+b])%mod;;
}
}
}
}
}
ok++;
}
printf("%d\n",dp[][][n-]);
return ;
}
Codeforces Round #316 (Div. 2) D、E的更多相关文章
- Codeforces Round #437 (Div. 2)[A、B、C、E]
Codeforces Round #437 (Div. 2) codeforces 867 A. Between the Offices(水) 题意:已知白天所在地(晚上可能坐飞机飞往异地),问是否从 ...
- Codeforces Round #298 (Div. 2) A、B、C题
题目链接:Codeforces Round #298 (Div. 2) A. Exam An exam for n students will take place in a long and nar ...
- Codeforces Codeforces Round #316 (Div. 2) C. Replacement set
C. Replacement Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/proble ...
- Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树
C. ReplacementTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/problem ...
- Codeforces Round #482 (Div. 2) C 、 Kuro and Walking Route(dfs)979C
题目链接:http://codeforces.com/contest/979/problem/C 大致题意 给出n个点,有n-1个边将他们链接.给出x,y,当某一路径中出现x....y时,此路不通.路 ...
- Codeforces Round #316 (Div. 2) C. Replacement
题意:给定一个字符串,里面有各种小写字母和' . ' ,无论是什么字母,都是一样的,假设遇到' . . ' ,就要合并成一个' .',有m个询问,每次都在字符串某个位置上将原来的字符改成题目给的字符, ...
- Codeforces Round #316 (Div. 2) B. Simple Game
思路:把n分成[1,n/2],[n/2+1,n],假设m在左区间.a=m+1,假设m在右区间,a=m-1.可是我居然忘了处理1,1这个特殊数据.被人hack了. 总结:下次一定要注意了,提交前一定要看 ...
- Codeforces Round #604 (Div. 2) D、E、F题解
Beautiful Sequence Beautiful Mirrors Beautiful Bracket Sequence (easy version) Beautiful Sequence \[ ...
- Codeforces Round #316 (Div. 2) D计算在一棵子树内某高度的节点
题:https://codeforces.com/contest/570/problem/D 题意:给定一个以11为根的n个节点的树,每个点上有一个字母(a~z),每个点的深度定义为该节点到11号节点 ...
随机推荐
- [Protractor] Testing With Protractor Page Objects
Protractor Page Objects are a recommended for testing your AngularJS applications. Page Objects abst ...
- 开发中可能会用到的几个 jQuery 小提示和技巧 (转)
转自:http://www.cnblogs.com/lhb25/p/useful-jquery-tips-and-tricks.html 今天,我们将分享一些很有用的技巧和窍门给 jQuery 开发人 ...
- angular指令浅谈
今天在闲暇时间再次对angularjs的指令进行了初探,不探不知道一探吓一跳啊, 就一个简单的指令整整难住我了两个小时,先不说代码的逻辑是否复杂,就一些内部的一些实现让我看起来都是头疼的不行啊,不过最 ...
- 大数据笔记02:大数据之Hadoop的生态系统和版本
1.Hadoop的生态系统: (1)图1: (2)图2: 图1 和 图2 都是形象说明了Hadoop的生态圈. 2.举例介绍Hadoop生态圈的小工具: (1)Hive工具(中文意思:小蜜蜂) 利用H ...
- 2008年NOI全国竞赛 假面舞会
/* 分三种情况 1 有环:找环长的gcd作为max gcd的超过2的最小因子作为min 2 树:所有最长链的和作为max 3为min (最长链≥3) 3 两条相交链:找出所有的这样的两条链的差 同1 ...
- C#正则怎么判断字符串中是否有汉字
Regex r = new Regex(".*[\\u4e00-\\u9faf].*");r.IsMatch(username)
- 《fullPage.js》创建全屏滚动的网站
插件介绍 fullPage.js是一个简单易用的插件,创建全屏滚动的网站(也被称为单页网站).它允许全屏滚动创建网站,以及添加内部滑块. 浏览器兼容性 主要功能 支持鼠标滚动 支持前进后退和键盘控制 ...
- AjaxManager的实现
在NeralJS思路整理一章中我们提到过实用ajax管理模块控制ajax请求,以减少ajax请求数量,优化加载,以下是ajax模块的实现,我已经确保经历简单. /** * Created by wil ...
- java反射机制(工厂模式)
http://www.phpddt.com/dhtml/338.html java里面没有typeof,js有. 我终于实现了用反射机制编写的工厂模式.java反射在工厂模式可以体现. 包含产品接口类 ...
- display 与 visibility
项目开发中经常会遇到需要显示和隐藏DOM元素.常用的两个是display,visibility属性,高级点的会用到angularJS的ng-show,ng-if指令. W3标准对这个两个属性的解释如下 ...