列表

详情


NC20130. [JLOI2011]小A的烦恼

描述

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

c c
现在小A想做的就是把各个文件按照从左往右的顺序拷到同一个文件当中。比如文件a的数据是
a1,b1,c1
a2,b2
文件b的数据是
a1,b1,c1,d1
a2,b2
a3,b3,c3
a4
那么她所希望的最终结果是
a

b


a1 b1 c1 a1 b1 c1 d1



a2 b2




a3 b3 c3



a4


这个结果在csv文件里就是
a,,,b,,,
a1,b1,c1,a1,b1,c1,d1
a2,b2,,a2,b2,,
,,,a3,b3,c3,
,,,a4,,,
以上结果的第一行是每一个文件的文件名,文件名与相应文件的第一列对齐。如果相应文件不止一列,那么其它列用空的单元格来补充。
输入的csv文件里保证了每一行的末尾都没有“,”,也就是说像a文件的第2行的第3列一样,如那一格是空的,那么在b2后面是没有“,”的。
输出的csv文件里因为是程序的输出结果,为了简化程序,如果末尾是空的,那么还是会显式输出“,”,如以上的结果所示。
输入文件保证至少有一行一列非空。
输出的文件要保证下一个文件的第一列要紧邻着上一文件的最后一个非空列的右面。最后一个文件只输出到最后一个非空列。

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

输入描述

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

输出描述

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

示例1

输入:

2
2 a
a1,b1,c1
a2,b2
4 b
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,,,

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 44ms, 内存消耗: 34276K, 提交时间: 2020-01-23 14:51:54

#include<bits/stdc++.h>
using namespace std;
int n, m, flag[105][10005], cnt[105], lin, row, num[105];
char a[105];
string s;
string qaq[105][10005];
int main() {
    scanf("%d", &n);
    int len = 0, ma = 0;
    for(int i = 1; i <= n; i ++) {
        scanf("%d", &m);
        scanf("%s", a);
        flag[1][++cnt[1]] = 1;
        qaq[1][cnt[1]] = a;
        int tmp = 1;
        for(int j = 2; j <= m + 1; j ++) {
            scanf("%s", a);
            int len = strlen(a);
            num[j] = 0;
            for(int k = 0; k < len; k ++) {
                char t = a[k];
                if(t != ',')    s = s + t;
                else {
                    num[j] ++;
                    cnt[j] ++;
                    qaq[j][cnt[j]] = s;
                    flag[j][cnt[j]] = 1;
                    s.clear();
                }
            }
            num[j] ++;
            cnt[j] ++;
            qaq[j][cnt[j]] = s;
            flag[j][cnt[j]] = 1;
            s.clear();
            tmp = max(num[j], tmp);
        }
        lin = max(lin, m + 1);
        row += tmp;
        for(int j = 1; j <= 100; j ++)    cnt[j] = row;
    }
    for(int i = 1; i <= lin; i ++) {
        for(int j = 1; j < cnt[i]; j ++) {
            if(flag[i][j])    cout << qaq[i][j];
            printf(",");
        }
        if(flag[i][cnt[i]])    cout << qaq[i][cnt[i]];
        printf("\n");
    }
}

C++11(clang++ 3.9) 解法, 执行用时: 14ms, 内存消耗: 2784K, 提交时间: 2020-03-10 12:29:47

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int M=1005;
int n,m,l,T,cnt[M+5];
string temp,ans[M+5];
void init()
{
	memset(cnt,0,sizeof(cnt));
	cin>>n;
	m=max(m,n);
	cin>>temp;
	ans[0]+=temp;
	for(int i=1;i<=n;i++)
	{
		cin>>temp;
		ans[i]+=temp;
		for(string::iterator it=temp.begin();it!=temp.end();++it)
		cnt[i]+=*it==',';
	}
	l=*max_element(cnt+1,cnt+n+1);
	if(!T) l--;
	for(int i=0;i<M;i++)
	for(int j=cnt[i];j<=l;j++)
	ans[i]+=',';
}
int main()
{
	cin>>T;
	while(T--)
	init();
	for(int i=0;i<=m;i++)
	cout<<ans[i]<<endl;
	return 0;
}

上一题