这几天好懒,昨天写的题,今天才来写博客....
这题你不知道它究竟有多少层,但是知道字符串长度不超过10^6,那么它的总容量是被限定的,用一个二维动态数组就OK了。输入字符串后,可以把它按照逗号分割成一个string数组,然后两个一处理就行,遇到0结束。
AC代码:
#include<cstdio>
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
char s[maxn];
string a[maxn];
vector<string>v[maxn/2];
int cur=0,ans,len;
int deal(){
int u=0;
for(int i=0;s[i]!='\0';++i){
if(s[i]==',') continue;
a[u]="";
while(s[i]!=','&&s[i]!='\0'){
a[u]+=s[i++];
}
++u;
--i;
}
return u;
}
int gett(string p){
int c=0;
for(int i=0;i<p.size();++i)
c=c*10+(p[i]-'0');
return c;
}
void dfs(int lev){
//if(cur>=len) return;
ans=max(ans,lev);
v[lev].push_back(a[cur++]);
int c=gett(a[cur++]);
for(int i=0;i<c;++i){
dfs(lev+1);
}
}
int main(){
while(scanf("%s",s)!=EOF){
len=deal();
cur=0;
ans=-1;
for(;cur<len;)
dfs(0);
printf("%d\n",ans+1);
for(int i=0;i<=ans;++i){
for(int j=0;j<v[i].size();++j)
if(j==0) cout<<v[i][j];
else cout<<" "<<v[i][j];
printf("\n");
}
for(int i=0;i<maxn/2;++i) v[i].clear();
}
return 0;
}
如有不当之处欢迎指出!