pku1635树的最小表示--分治递归
2011-07-23 10:26
281 查看
题意:给定一棵树,其根节点是确定的,然后通过这个根节点可以有很多种遍历方式(保证每条边只进出一次),远离根节点用0表示,向根节点靠近用1表示,则如010011与001101就是同一棵树的两种遍历方式。然后给你两个遍历得到的01串(不超过3000个字符),问你这两棵树是不是一样的。。。
分析: 这题稍微想一下可以想到应该通过一定的方式将两个串都按照一定的规则变化,看最后两个串是否一样,很显然可以想到去找这棵树的最小的表现形式,即0尽可能靠前。。也就是尽可能先找最深的节点。。。
这怎么实现呢?可以想到,一棵树有很多子树,然后我们可以对这棵树分到各个子树下去,分到足够小之后就只有一棵树了,直接返回这棵树,然后对某个节点下面有几棵树,我们就对代表这几棵树的字符串进行排序,重新放回原来的串中。。。这里,思路就很清晰了。。。由于这个数组不大好开,我们就用vector<string>吧,和zoj3261一样,不好处理的地方都用stl来做就比较方便了。。。
注意有个小地方:每次往下走的时候必定要经过这棵子树的根节点,而这个根节点下面还有可能有很多子树,所以得把这个根节点灭掉再往下走,也就是将第一个0和最后一个1灭掉。。。
代码:
分析: 这题稍微想一下可以想到应该通过一定的方式将两个串都按照一定的规则变化,看最后两个串是否一样,很显然可以想到去找这棵树的最小的表现形式,即0尽可能靠前。。也就是尽可能先找最深的节点。。。
这怎么实现呢?可以想到,一棵树有很多子树,然后我们可以对这棵树分到各个子树下去,分到足够小之后就只有一棵树了,直接返回这棵树,然后对某个节点下面有几棵树,我们就对代表这几棵树的字符串进行排序,重新放回原来的串中。。。这里,思路就很清晰了。。。由于这个数组不大好开,我们就用vector<string>吧,和zoj3261一样,不好处理的地方都用stl来做就比较方便了。。。
注意有个小地方:每次往下走的时候必定要经过这棵子树的根节点,而这个根节点下面还有可能有很多子树,所以得把这个根节点灭掉再往下走,也就是将第一个0和最后一个1灭掉。。。
代码:
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; const int N=20010; char s1 , s2 , str , stmp ; int n1, n2; void change(char *s, int l, int r) { if(r<l) return; int cnt0=0, cnt1=0, i, j, k; int l1=l, r1=l; vector<string> vs; for(i=l; i<=r; i++) { if(s[i]=='0') cnt0++; else cnt1++; r1 = i; if(cnt0==cnt1) { change(s, l1+1, r1-1); for(j=l1; j<=r1; j++) stmp[j-l1] = s[j]; stmp[j-l1] = 0; vs.push_back(stmp); l1 = r1+1; r1 = r1+1; cnt0 = cnt1 = 0; } } sort(vs.begin(), vs.end()); i = l; for(k=0; k<vs.size(); k++) { for(j=0; j<vs[k].size(); j++) { s[i++] = vs[k][j]; } } vs.clear(); } int main() { int i, cas; scanf("%d", &cas); while(cas--) { scanf("%s%s", s1, s2); n1 = strlen(s1); n2 = strlen(s2); change(s1, 0, n1-1); change(s2, 0, n2-1); if(strcmp(s1, s2)==0) printf("same\n"); else printf("different\n"); } return 0; }
相关文章推荐
- pku 1635 Subway tree systems(树的同构,最小表示)
- poj 1635 树的最小表示法
- PKU 1509 Glass Beads (最小表示法)
- poj 1635 Subway tree systems(树的最小表示)
- [最小表示]PKU 3349 Snowflake Snow Snowflakes
- pku 3349 Snowflake Snow Snowflakes(hash,最小表示法)
- 分治 递归 引用 求一个数组中的最大和最小元素
- PKU 1509 Glass Beads (最小表示法)
- 递归和分治的应用(pku 2287)
- Poj 1635 Subway tree systems (树的最小表示)
- cf559B字符串的最小表示法和递归的写法
- POJ 1635 Subway tree systems 树的Hash 或 树的最小表示法
- [有向树的最小表示] poj 1635 Subway tree systems
- Subway tree systems - POJ 1635 树的最小表示法
- POJ 1635 树的最小表示法
- poj 1635 Subway tree systems 判断树的同构 树的最大最小表示法模板
- POJ 1635 Subway tree systems (树的最小表示法)
- POJ1635 树的最小表示
- POJ-1635:Subway tree systems(树的最小表示法)
- 分治递归:求数组元素的最大值,最小值