如何将字符串和编号联系起来?显然要用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;
}