当前位置: 首页 > news >正文

揭秘低价网站建设危害重庆建设工程招标信息网

揭秘低价网站建设危害,重庆建设工程招标信息网,非洲跨境电商平台有哪些,网站建设的实践目的题目链接 思路: 对于一条链可以组成回文串,意味着最多只有一个奇数字母,比起我们记录路径各个字母的个数和,我们可以发现回文串实际上不在意真正的个数,只在意个数的奇偶。又我们发现字母只有20来个,可以使…

题目链接

思路:

        对于一条链可以组成回文串,意味着最多只有一个奇数字母,比起我们记录路径各个字母的个数和,我们可以发现回文串实际上不在意真正的个数,只在意个数的奇偶。又我们发现字母只有20来个,可以使用状态压缩,那么我们只需要判断压缩后状态里1的个数是否为0或者1.

        对于树上的链异或和,我们都可以用前缀异或和的思想,将x->y的异或和看成v[x]^v[fa[lca]]^v[y]^v[fa[lca]],v表示该点到根的异或和,可以发现就等于两个位置的异或和。

        对于以x为根的子树里的链只有三种情况:

        1.不经过根

        2.链的一端是根

        3.跨过根

        容易知道,对于第1种情况我们可以看成x子树里的某个子树的情况3,所以我们只需要计算每个点的子树里的2,3情况即可。

        假如我们遍历到第y个子树,前面已经遍历处理完x个子树。我们要处理y和前面x个子树的跨根贡献的话,我们不能先将y子树的值处理了,因为这可能导致结果是y和y子树里不经过根的链,

所以对于每次我们先calc掉x和y的链,再add掉y这个子树的内容。

        代码:

#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const int N=5e5+10;
const int mod=1e9+7;
#define fi first
#define se secondint n,val[N];
vector<int> ve[N];
int son[N],siz[N];
int fac[30],mask[N],dep[N];
int ans[N],maxx,vis[(1<<25)];
int flag;
int rtdis;void dfs1(int x,int f){siz[x]=1;dep[x]=dep[f]+1;for(auto y:ve[x]){if(y==f) continue;mask[y]^=mask[x];	dfs1(y,x);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}
}void calc(int u,int f){if(vis[mask[u]]){maxx=max(maxx,vis[mask[u]]+dep[u]-rtdis);}for(int i=0;i<=22;i++){if(vis[mask[u]^fac[i]]){maxx=max(maxx,vis[mask[u]^fac[i]]+dep[u]-rtdis);}}for(auto v:ve[u]){if(v==f||v==flag)continue;calc(v,u);}
}void add(int u,int f,int value){if(value==1){vis[mask[u]]=max(vis[mask[u]],dep[u]);}else{vis[mask[u]]=0;}for(auto v:ve[u]){if(v==f||v==flag)continue;add(v,u,value);}
}
void dfs2(int u,int f,bool keep){for(auto v:ve[u]){if(v==f||v==son[u])continue;dfs2(v,u,0);ans[u]=max(ans[u],ans[v]);//不经过根节点 }if(son[u]){dfs2(son[u],u,1);flag=son[u];ans[u]=max(ans[u],ans[son[u]]);//不经过根节点 }rtdis=dep[u]*2;//根节点的dep两倍,方便下面for循环计算跨根的距离 for(auto v:ve[u]){//计算跨根距离,dis(u,v)=dep(u)+dep(v)-2dep(lca),lca就是现在的u if(v==f||v==flag)continue;calc(v,u);//跨根计算和点分治一样,遍历了x个子树,现在是y子树,先不加y子树的贡献 add(v,u,1);//先计算y到前面x个子树的距离,算完再加上y子树的贡献,add }//以根为一端 if(vis[mask[u]]){//异或为0 maxx=max(maxx,vis[mask[u]]-dep[u]);}for(int i=0;i<=22;i++){//遍历异或和为2的幂 if(vis[mask[u]^fac[i]]){maxx=max(maxx,vis[mask[u]^fac[i]]-dep[u]);}}//前面的add都是从子节点进去的,没有跟新到当前节点 vis[mask[u]]=max(vis[mask[u]],dep[u]);//同理先不算当前节点的贡献,算完这种情况再add flag=0; //flag清空是为了下面如果keep=0时把整个子树删掉(包括这颗子树的重儿子) ans[u]=max(maxx,ans[u]);//三种情况都计算完了再更新答案 if(!keep){add(u,f,-1);//add里没有重置maxx和rtdis maxx=0;//答案已经存在ans【u】了,删除整个子树要重置maxx//maxx不重置在回溯回去更新其他子树(不包括当前maxx链的子树)答案会可能取不到这个maxx //rtdis=0;rtdis可重置可不重置,因为用前都重新赋值 } 
}
void solve(){cin>>n;fac[0]=1;for(int i=1;i<=23;i++)fac[i]=fac[i-1]*2;for(int i=2;i<=n;i++){int a;char b;cin>>a>>b;ve[a].push_back(i);ve[i].push_back(a);val[i]=fac[b-'a'];mask[i]=fac[b-'a'];}dfs1(1,0);dfs2(1,0,0);for(int i=1;i<=n;i++)cout<<ans[i]<<' ';
}
signed  main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;//cin>>t;while(t--){solve();}return 0;
}

http://www.yayakq.cn/news/795599/

相关文章:

  • 购物网站建设前的市场分析广州网站建设大公司排名
  • 泰兴网站建设佛山网站建设公司哪家性价比高
  • ps做好切片后怎么做网站推广计划是什么
  • 广州黄埔区建设局网站局百度联盟广告收益
  • 门户网站开发 系统介绍北京人事考试网
  • asp网站开发 知识永安城乡建设局网站
  • 什么是建设企业网站梅州市建设培训中心网站
  • 模板网站 知乎室内设计师网站十大网站
  • Hdi做指数网站网站搭建 主机推荐
  • 长春火车站到长春机场大巴时刻表seo 深圳
  • 网站制作需要什么软件网络安全十大公司
  • 韩国购物网站做企业网站通常哪找素材
  • 沈阳网站建设技术公司排名网站关键词是什么意思
  • 一般的网站都是用什么系统做的制作成长纪念册
  • 网站建设与维护工作待遇做外贸比较好得网站
  • 赣州人才网站路由器做网站主机要备案吗
  • 谷歌网站英文新河官网
  • 建网站科技公司长沙招聘信息2022
  • 网上智慧团建网站登录毕业设计网站设计步骤
  • 合肥网站建设兼职wordpress短代码使用
  • wordpress能做企业网站吗重庆市工程建设信息网中项网
  • 手机app下载官方沈阳网站的优化
  • 市政建设招标网站有哪些做网站需要编程
  • 地域性旅游网站建设系统结构wordpress设置网页缩略图
  • 国内使用vue做的网站婚庆网站设计
  • 钓鱼网站到底怎么做影视小程序搭建教程
  • 又名林州站长网网站建设w亿玛酷1专注
  • 网站发语音功能如何做网页广告过滤
  • 做网站需要注意的c2c平台是洗钱吗
  • 网站流量运营网页升级升级跳转