这几天好懒,昨天写的题,今天才来写博客....
这题你不知道它究竟有多少层,但是知道字符串长度不超过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; }
如有不当之处欢迎指出!