POJ1760 Disk Tree (目录)

如何将字符串和编号联系起来?显然要用map。第一个问题就解决了。

那么如何组织成一棵树呢?上面说了用类似建trie的方式编号,具体的实现方式自然就是用map数组map<string,int>M[maxn]。每一个M[i]都是一个map,而M[i]可以组织起根节点编号为i的所有子树。

同样是两个map,第一个AC,第二个TLE
就我看来,第一个调用string成员函数对字符串进行处理。
而第二个,在string跟char类型的字符串间进行进行转化浪费时间,而且还多了一个for循环进行对字符串进行处理了。

#include <string>
#include <cstring>
#include <cstdio>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;

#define MAXNODE 20000   //输入文本每行最多40个结点,40*500

map<string, int> m[MAXNODE];

void print(int n,int s)
{
    for(map<string,int>::iterator it=m[n].begin();it!=m[n].end();it++)
    {
        for(int j=0;j<s;j++)
            cout<<' ';
        cout<<it->first<<endl;
        print(it->second,s+1);
    }
}

int main()
{
    string s,t;
    int n,tot=0;
    cin>>n;
    while(n--)
    {
        int now=0;       //当前树的节点编号。
        cin>>t;
        int p=0,pos=0;
        while((p=t.find('\\',p))!=-1)
        {
            s=t.substr(pos,p-pos);
            if(!m[now].count(s)) m[now][s]=++tot;
            now=m[now][s];
            pos=++p;
        }
        s=t.substr(pos);
        if(!m[now][s]) m[now][s]=++tot;
    }
    print(0,0);
    return 0;
}
#include <string>  
#include <cstring>  
#include <cstdio>  
#include <map>  
using namespace std;  

#define MAXNODE 20000   //输入文本每行最多40个结点,40*500  
#define MAXLEN 85  
#define MAXWORD 45  

map<string, int> m[MAXNODE];  

void preOder_traversal(int midx, int indentation)  
{  
    for (map<string, int>::iterator i=m[midx].begin(); i!=m[midx].end(); ++i)  
    {  
        for (int i=0; i<indentation; ++i)    printf(" ");  
        printf("%s\n", (i->first).c_str());  

        preOder_traversal(i->second, indentation+1);  
    }  
}  

int main()  
{  
    //freopen("D:\\in.txt", "r", stdin);  
    //freopen("D:\\out.txt", "w", stdout);  

    int n, i, j, midx, midx_counter=0;  
    char str[MAXLEN];  
    int word_init[MAXWORD];  
    string current_str;  

    scanf("%d", &n);  

    while (n--)  
    {  
        scanf("%s", str);  

        //下面把str中的单词分割开来  
        word_init[0]=0;  
        j=1;  
        for (i=0; str[i]; ++i)  //0是空字符'\0'的十进制值  
        {  
            if(str[i]=='\\')  
            {  
                str[i]=0;  
                word_init[j++]=i+1; //第j个单词从str[i+1]开始  
            }  
        }  

        midx=0; //从树根开始  
        for (i=0; i<j; ++i)  //有j个单词  
        {  
            current_str=str+word_init[i];  

            if(!m[midx].count(current_str)) //新结点  
            {  
                m[midx][current_str]=(++midx_counter);  
            }  

            midx=m[midx][current_str];  
        }  
    }  

    preOder_traversal(0, 0);  

    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/80294533