POJ 1635 Subway tree systems

来源:互联网 发布:mac有什么游戏玩儿 编辑:程序博客网 时间:2024/06/08 04:54

 /*主要是根据输入串建树,然后对树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;
}

原创粉丝点击