P5483 [JLOI2011]小A的烦恼

题目描述

AAA是BBB公司的一名PM(productmarket)PM(product market)PM(productmarket)。BBB公司越来越注重产品使用情况分析,而小AAA的工作就是整天对着一堆数据分析来分析去,没完没了。其中有一个操作是小AAA很头疼的,就是要把多个csvcsvcsv文件的数据拷到同一个excelexcelexcel文件中去。 有一天小AAA满怀期待地找到了你,一个高级程序员,她想让你写程序帮她完成这个简单重复性工作。这不是坑爹吗,直接操作excelexcelexcel还要用到第三方的库,还不如直接写到csvcsvcsv文件中,让她再手动去转成excelexcelexcel文件。经过内部沟通协调,最终定下了这个方案。 csvcsvcsv是一种excelexcelexcel可支持和格式,且存储方式非常简单。它实际上就是用“,”来分隔相邻的两个列。比如以下三行数据:

a,a,a
b,,b
,c,c

表示的就是:

a a a
b   b
  c c

现在小AAA想做的就是把各个文件按照从左往右的顺序拷到同一个文件当中。比如文件aaa的数据是:

a1,b1,c1
a2,b2

文件bbb的数据是:

a1,b1,c1,d1
a2,b2
a3,b3,c3
a4

那么她所希望的最终结果是:

a     b      
a1 b1 c1 a1 b1 c1 d1
a2 b2   a2 b2    
      a3 b3 c3  
      a4      

这个结果在csvcsvcsv文件里就是:

a,,,b,,,
a1,b1,c1,a1,b1,c1,d1
a2,b2,,a2,b2,,
,,,a3,b3,c3,
,,,a4,,,

以上结果的第一行是每一个文件的文件名,文件名与相应文件的第一列对齐。如果相应文件不止一列,那么其它列用空的单元格来补充。
输入的csvcsvcsv文件里保证了每一行的末尾都没有“,”,也就是说像aaa文件的第222行的第333列一样,如那一格是空的,那么在b2b2b2后面是没有“,”的。
输出的csvcsvcsv文件里因为是程序的输出结果,为了简化程序,如果末尾是空的,那么还是会显式输出“,”,如以上的结果所示。
输入文件保证至少有一行一列非空。
输出的文件要保证下一个文件的第一列要紧邻着上一文件的最后一个非空列的右面。最后一个文件只输出到最后一个非空列。

输入格式

第一行有一个整数NNN(1≤N≤1001\leq N\leq 1001N100),表示有NNN个文件。
以下NNN个数据块的第一行有一个整数MMM (1≤M≤1001\leq M\leq 1001M100)和一个字符串SSS (1≤length(S)≤1001\leq length(S)\leq 1001length(S)100),M表示文件的行数,SSS表示文件名。
NNN个数据块的下面MMM行中,每一行是一个字符串TTT(1≤length(T)≤1001\leq length(T)\leq 1001length(T)100),TTT只包含小写字母和“,”。

输出格式

输出把NNN个文件的数据合到一个文件的结果。

输入输出样例

输入 #1
2
2 a
a1,b1,c1
a2,b2
4 b
a1,b1,c1,d1
a2,b2
a3,b3,c3
a4
输出 #1
a,,,b,,,
a1,b1,c1,a1,b1,c1,d1
a2,b2,,a2,b2,,
,,,a3,b3,c3,
,,,a4,,,

思路

代码

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

const int N=110;

int t,maxn;
int num[N][N];
char nam[N][N];
char th[N][N][N];
int n[N],maxnum[N];

int main () {
	scanf("%d",&t);
	for(int i=1; i<=t; i++) {
		scanf("%d",&n[i]);
		maxn=max(n[i],maxn);
		scanf("%s",nam[i]+1);
		for(int j=1; j<=n[i]; j++) {
			scanf("%s",th[i][j]+1);
			int len=strlen(th[i][j]+1);
			for(int k=1; k<=len; k++)
				if(th[i][j][k]==',')
					num[i][j]++;
			//if(num[i][j]>maxnum[i])
			maxnum[i]=max(maxnum[i],num[i][j]);
		}
	}
	for(int i=1; i<=t; i++) {
		printf("%s",nam[i]+1);
		for(int k=1; k<=maxnum[i]; k++)
			printf(",");
		if(i!=t)
			printf(",");
	}
	printf("\n");
	for(int j=1; j<=maxn; j++) {
		for(int i=1; i<=t; i++) {
			if(n[i]<j)
				for(int k=1; k<=maxnum[i]; k++)
					printf(",");
			else {
				printf("%s",th[i][j]+1);
				if(num[i][j]<maxnum[i]) {
					int x=maxnum[i]-num[i][j];
					for(int k=1; k<=x; k++)
						printf(",");
				}
			}
			if(i!=t)
				printf(",");
		}
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/mysh/p/11784481.html
今日推荐