---
# System prepended metadata

title: 13409 - Make sentence
tags: [dynamic memory]

---

# 13409 - Make sentence
>author: Utin
###### tags: `dynamic memory`

---

## Brief
See the code below

## Solution 0

```c=
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int len[101];
char* str[101];
int n, m;

void add(int x, char* s);
void del(int x, int k);
void swap(int a, int b);
void longest();
void all();

int main() {
    for (int i = 0; i < 101; i++) {
        str[i] = (char*) malloc(1);
        str[i][0] = '\0'; // 記得初始化
        len[i] = 0; // 記得初始化
    }
    scanf("%d %d", &n, &m);
    char op[8];
    for (int i = 0; i < m; i++) {
        scanf("%s", op);
        if (op[1] == 'd') {
            int x;
            char s[101];
            scanf("%d %s", &x, s);
            x -= 1;
            add(x, s);
        }
        else if (op[1] == 'e') {
            int x, k;
            scanf("%d %d", &x, &k);
            x -= 1;
            del(x, k);
        }
        else if (op[1] == 'w') {
            int a, b;
            scanf("%d %d", &a, &b);
            a -= 1;
            b -= 1;
            swap(a, b);
        }
        else if (op[1] == 'o') longest();
        else if (op[1] == 'l') all();
    }
}

void add(int x, char* s) {
    int temp_len = strlen(s);
    char* temp = (char*) malloc(temp_len + len[x] + 1);
    strcpy(temp, str[x]);
    strcpy(temp + len[x], s);
    free(str[x]);
    str[x] = temp;
    len[x] += temp_len;
}

void del(int x, int k) {
    if (k >= len[x]) {
        free(str[x]);
        str[x] = (char*) malloc(1);
        str[x][0] = '\0'; // 記得初始化
        len[x] = 0;
    }
    else {
        len[x] -= k;
        char* temp = (char*) malloc(len[x] + 1);
        strncpy(temp, str[x], len[x]);
        temp[len[x]] = '\0'; //把結尾設'\0'
        free(str[x]);
        str[x] = temp;
    }
}

void swap(int a, int b) {
    char* temp = str[a];
    str[a] = str[b];
    str[b] = temp;
    int temp_len = len[a];
    len[a] = len[b];
    len[b] = temp_len;
}

void longest() {
    int max = len[0], index = 0;
    for (int i = 1; i < n; i++) {
        if (len[i] > max) {
            max = len[i];
            index = i;
        }
    }
    printf("%d %s\n", len[index], str[index]);
}

void all() {
    for (int i = 0; i < n; i++) {
        printf("%s\n",str[i]);
    }
}
// By Utin
```

## Reference