CodeForces-747E

时间:2021-07-07 10:40:33

这几天好懒,昨天写的题,今天才来写博客....

这题你不知道它究竟有多少层,但是知道字符串长度不超过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;
}

如有不当之处欢迎指出!

相关文章