/*主要是根据输入串建树,然后对树DFS,重新获得一个排序后的01串。
对两个输入串分别运用上述方法分别得到两个排序后的01串,如果两个串相等则same,否则different
关键在于DFS时对子树返回的01串进行存储和排序,然后重组
比如对于
0100101100100111和0011000111010101,重组后分别变成:
0001101100101101和0001110011010101,不相等所以输出different
*/
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#define MAX_N 3000
using namespace std;
struct tree
{
tree *parent;
tree *next; //第一个儿子
tree *bro; //兄弟
tree()
{
parent = next = bro = NULL;
}
};
//建树
tree *buildTree(string str)
{
int p;
char ch;
tree *root = new tree();
tree *cur = root;
for(p = 0; p < str.length(); p++)
{
ch = str[p];
if(ch == '0')
{
tree *temp = new tree();
temp->parent = cur;
tree *nptr = cur;
if(nptr->next)
{
nptr = nptr->next;
while(nptr->bro)
nptr = nptr->bro;
nptr->bro = temp;
}
else
nptr->next = temp;
cur = temp;
}
else if(ch == '1')
{
cur = cur->parent;
}
}
return root;
}
tree *beginRoot;
//重组DFS,获得排序后的01串
string travelSeq(tree *root)
{
tree *nptr = root;
vector<string> vec;
//遍历所有儿子
if(nptr->next)
{
vec.push_back(travelSeq(nptr->next));
nptr = nptr->next;
while(nptr->bro)
{
vec.push_back(travelSeq(nptr->bro));
nptr = nptr->bro;
}
}
//排序
sort(vec.begin(), vec.end());
vector<string>::iterator iter = vec.begin();
string res = "";
//组合
for(; iter != vec.end(); iter++)
res += *iter;
if(root != beginRoot) res = '0' + res + '1';
return res;
}
int main()
{
int caseN;
string str1, str2;
scanf("%d", &caseN);
while(caseN--)
{
cin>>str1>>str2;
beginRoot = buildTree(str1);
str1 = travelSeq(beginRoot);
beginRoot = buildTree(str2);
str2 = travelSeq(beginRoot);
if(str1 == str2)
printf("same/n");
else
printf("different/n");
}
return 0;
}
POJ 1635 Subway tree systems
本文介绍了一种通过构建树结构并使用深度优先搜索(DFS)来重组和比较两个01串的方法。该方法首先根据输入串构建树,再通过DFS获取排序后的01串,最后比较两个串是否相同。


被折叠的 条评论
为什么被折叠?



