树上的回文 51Nod - 1513

2024-02-22 18:18
文章标签 回文 51nod 树上 1513

本文主要是介绍树上的回文 51Nod - 1513,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1513

对每层的点分别按dfs序中的位置排序 然后对每个字母搞一个前缀和 对每个查询 找出该点在dfs序上对应区间的左右端点 在给定层上二分一下即可

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int maxn=5e5+10;struct node1
{int v,next;
};struct node2
{bool gou[26];
};vector <int> pre[maxn];
vector <node2> sum[maxn];
node1 edge[maxn];
int first[maxn],val[maxn],deep[maxn],mp1[maxn],mp2[maxn];
int n,q,num;
char ch[maxn];template <class T>
inline void _cin(T &ret)
{char c;ret = 0;while((c = getchar()) < '0' || c > '9');while(c >= '0' && c <= '9'){ret = ret * 10 + (c - '0');c = getchar();}
}bool cmp(int u,int v)
{return mp1[u]<mp1[v];
}void addedge(int u,int v)
{edge[num].v=v;edge[num].next=first[u];first[u]=num++;
}void dfs(int cur)
{int i,v;pre[deep[cur]].pb(cur);mp1[cur]=++num;for(i=first[cur];i!=-1;i=edge[i].next){v=edge[i].v;deep[v]=deep[cur]+1;dfs(v);}mp2[cur]=num;
}void init()
{node2 tmp;int i,j,k;for(i=0;i<26;i++) tmp.gou[i]=0;for(i=1;i<=n;i++) sort(pre[i].begin(),pre[i].end(),cmp);for(i=1;i<=n;i++){for(j=0;j<pre[i].size();j++) sum[i].pb(tmp);for(j=0;j<pre[i].size();j++){if(j>0){for(k=0;k<26;k++) sum[i][j].gou[k]=sum[i][j-1].gou[k];}sum[i][j].gou[val[pre[i][j]]]^=1;}}
}int main()
{int i,p,h,l,r,m,pl,pr,cnt;///freopen("in.txt","r",stdin);///freopen("out.txt","w",stdout);_cin(n),_cin(q);///scanf("%d%d",&n,&q);memset(first,-1,sizeof(first));for(i=2;i<=n;i++){_cin(p);///scanf("%d",&p);addedge(p,i);}scanf("%s",ch);for(i=0;i<n;i++) val[i+1]=ch[i]-'a';deep[1]=1;num=0;dfs(1);init();while(q--){_cin(p),_cin(h);///scanf("%d%d",&p,&h);if(deep[p]>h||pre[h].size()==0) printf("Yes\n");else{l=0,r=pre[h].size()-1,pl=-1;while(l<=r){m=(l+r)/2;if(mp1[pre[h][m]]<mp1[p]) l=m+1;else r=m-1,pl=m;}l=0,r=pre[h].size()-1,pr=-1;while(l<=r){m=(l+r)/2;if(mp1[pre[h][m]]>mp2[p]) r=m-1;else l=m+1,pr=m;}if(pl==-1||pl>pr) printf("Yes\n");else{cnt=0;if(pl==0){for(i=0;i<26;i++) if(sum[h][pr].gou[i]) cnt++;}else{for(i=0;i<26;i++) if((sum[h][pl-1].gou[i])^(sum[h][pr].gou[i])) cnt++;}if(cnt<=1) printf("Yes\n");else printf("No\n");}}}return 0;
}/*
6 2
1 1 1 3 3
zacccd
3 1
5 2
*/

 

这篇关于树上的回文 51Nod - 1513的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736094

相关文章

csu1328(近似回文串)

题意:求近似回文串的最大长度,串长度为1000。 解题思路:以某点为中心,向左右两边扩展,注意奇偶分开讨论,暴力解即可。时间复杂度O(n^2); 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#inclu

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

NYOJ 37 回文字符串(记忆化搜索)

OJ题目 : 戳这里~~ 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000.

leetcode: 5. 最长回文子串

5. 最长回文子串 题目链接https://leetcode.cn/problems/longest-palindromic-substring/ 题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2:

java常用算法之最长回文子串(Longest Palindromic Substring)

方法一:时间复杂度为O(n^3) public static String longestPalindrome1(String s) {int maxPalinLength = 0;String longestPalindrome = null;int length = s.length();// check all possible sub stringsfor (int i = 0; i

力扣-9. 回文数

文章目录 力扣题目代码工程方法1:方法2: 力扣题目 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而 123 不是。 示例 1: 输入:x = 121 输出:true 示例 2: 输入:x = -121 输出:false 解释:从左

psd面试(最长回文子序列+动态规划);

点击打开链接 链接:https://www.nowcoder.com/acm/contest/90/D来源:牛客网 题目描述 掌握未来命运的女神 psd 师兄在拿了朝田诗乃的 buff 后决定去实习。 埃森哲公司注册成立于爱尔兰,是一家全球领先的专业服务公司,为客户提供战略、咨询、数字、技术和运营服务及解决方案。他们立足商业与技术的前沿,业务涵盖40多个行业,以及企业日常运营部门的各个

代码随想录刷题day23丨39. 组合总和,40.组合总和II, 131.分割回文串

代码随想录刷题day23丨39. 组合总和,40.组合总和II, 131.分割回文串 1.题目 1.1组合总和 题目链接:39. 组合总和 - 力扣(LeetCode) 视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0039.%E7%

后缀数组 - 求最长回文子串 + 模板题 --- ural 1297

1297. Palindrome Time Limit: 1.0 second Memory Limit: 16 MB The “U.S. Robots” HQ has just received a rather alarming anonymous letter. It states that the agent from the competing «Robots Unlim

[置顶]论如何优雅的处理回文串 - 回文自动机详解

写在前面 最近无意中看到了这个数据结构,顺便也就学习了一下。 而且发现网上关于这个算法的描述有很多地方是错的,在这里做了一些更正。 处理字符串的算法很多:     KMP,E-KMP,AC自动机,后缀三兄弟:后缀树、后缀数组、后缀自动机,Trie树、Trie图,符串hash... 但以上数据结构在处理回文串上还是稍有欠缺,用这些来处理回文显得太小题大做。 于是有了Manacher算