1. 程式人生 > >【BZOJ】2760: [JLOI2011]小A的煩惱【字串模擬】

【BZOJ】2760: [JLOI2011]小A的煩惱【字串模擬】

2760: [JLOI2011]小A的煩惱

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 406  Solved: 258
[ Submit][ Status][ Discuss]

Description

小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   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檔案裡因為是程式的輸出結果,為了簡化程式,如果末尾是空的,那麼還是會顯式輸出“,”,如以上的結果所示。 輸入檔案保證至少有一行一列非空。 輸出的檔案要保證下一個檔案的第一列要緊鄰著上一檔案的最後一個非空列的右面。最後一個檔案只輸出到最後一個非空列。

Input

第一行有一個整數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只包含小寫字母和“,”。

 

Output

輸出把N個檔案的資料合到一個檔案的結果。

Sample Input

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

Sample Output

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

Solution

模擬題!

定了一個$flag$,表示第$i$行第$j$列這一格有沒有東西。

每次將列數取max往後平移即可。

本來以為自己亂yy的$string$過不了的QAQ

結果調了5分鐘就a掉了!!

氣死$Abyssful$是我的人生目標!!

Code

#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");
    }
}