bzoj1942: [Ceoi2007]Ministry
来源:互联网 发布:淘宝卖的哈曼卡顿真假 编辑:程序博客网 时间:2024/05/17 21:51
传送门
我们在建树的时候求出每个节点的哈希值
哈希函数你就乱搞一下 反正出题人不会来卡你哈希
#include<map>#include<cmath>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define N 1000005#define pa pair<int,pair<int,int> >#define mk make_pairusing namespace std;char s[N*2];int n,x,nx,cnt,tot=1,tmp,mx;int f[N],dep[N],ch[N][3],sum[N];map<pa,int> mp;vector<int> ans[N];int main(){ scanf("%s",s+1); n=strlen(s+1)/2; x=0; mp[mk(0,mk(0,0))]=1; for (int i=1;i<=2*n;i++){ if (s[i]=='('){ nx=++cnt; f[nx]=x; x=nx; } else{ if (ch[x][0]>ch[x][1]) swap(ch[x][0],ch[x][1]); if (ch[x][0]>ch[x][2]) swap(ch[x][0],ch[x][2]); if (ch[x][1]>ch[x][2]) swap(ch[x][1],ch[x][2]); pa tmp=mk(ch[x][0],mk(ch[x][1],ch[x][2])); if (!mp.count(tmp)) mp[tmp]=++tot; ans[dep[x]].push_back(mp[tmp]); mx=max(mx,dep[x]); dep[f[x]]=max(dep[f[x]],dep[x]+1); ch[f[x]][sum[f[x]]++]=mp[tmp]; x=f[x]; } } for (int i=0;i<=mx;i++){ tmp=1; sort(ans[i].begin(),ans[i].end()); for (int j=1;j<ans[i].size();j++) if (ans[i][j]!=ans[i][j-1]) tmp++; printf("%d\n",tmp); }}
阅读全文
0 0
- bzoj1942: [Ceoi2007]Ministry
- Ministry
- bzoj1943: [Ceoi2007]Nasty Calculations
- bzoj1945: [Ceoi2007]Royaltreasury
- pku2353 Ministry
- poj Ministry
- B - Ministry
- bzoj1942 货币兑换【动态规划+CDQ分治】
- ural 1029 Ministry
- ural 1029 Ministry
- POJ 2353 Ministry [DP]
- ural 1029. Ministry (dp)
- ural 1029. Ministry
- Timus 1029. Ministry
- poj 2353 Ministry
- POJ 2353 Ministry DP
- POJ2353——Ministry
- poj 2353 Ministry
- uva 814 The Letter Carrier's Rounds
- Ubuntu16.04系统装机必做
- Zabbix 安装
- ubuntu 16.04 安装openCv3.1
- tomcat正常启动访问页面是空白页解决办法
- bzoj1942: [Ceoi2007]Ministry
- C++定义一个只能在堆上(栈上)生成对象的类
- HDU4691用RMQ求所有字符串后缀的最长公共前缀
- 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000
- POJ1611
- 单节点nginx环境搭建
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
- (一)Linux中vi的复制粘贴命令
- 扫雷