/*
 * Problema 1
 *
 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
        char c = 'a', *p, s[100];
        p = &c;
        printf("%c %c %c", *p, *p + 1, *p + 2);
        s[0] = 'A';
        s[1] = 'B';
        s[2] = 'C';
        s[3] = '\0';
        p = s;
        printf("\n%s %s %c %s", s, p, *(p + 1), p + 1);
        strcpy(s, "\nacesta este un exemplu de lucru cu pointeri");
        printf("%s", s);
        p += 17;
        for (; *p != '\0'; ++p) {
                if (*p == 'e')
                        *p = 'E';
                if (*p == ' ')
                        *p = '\n';
        }
        printf("%s\n", s);
        return 0;
}

/*
 * Problema 2
 *
 */

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void *my_realloc(void *p, int n)
{
        void *x;
        x = malloc(n);
        memcpy(x, p, n);
        free(p);
        return x;
}

int main()
{
        char *p;
        p = (char *) malloc(sizeof(char) * 5);
        strcpy(p, "abcd");
        p = (char *) my_realloc(p, 20);
        strcat(p, "cioco");
        printf("%s", p);
        return 0;
}

/*
 * Problema 3
 *
 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


char *my_strdup(char *s)
{
        char *p = (char *) malloc(strlen(s) + 1);
        strcpy(p, s);
        return p;
}

int main()
{
        char buf[512];
        char *p;
        scanf("%s", buf);
        p = my_strdup(buf);
        printf("%s", p);
        return 0;
}

/*
 * Problema 4
 *
 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *my_replace(char *s, char *s1, char *s2)
{
        /*in vectorul auxiliar se aloca memorie(din sirul total se scaote sirul care trebuie inlocuit
          si se aduaga dimensiunea sirului cu care este inlocuit */
        char *aux = (char *) malloc((sizeof(s) - sizeof(s1)) + sizeof(s2) + 1);
        int i = strstr(s, s1) - s, j = strlen(s1);
        strncpy(aux, s, i);
        strcat(aux, s2);
        strncat(aux, (s + i + j), (strlen(s) - i - j));
        return aux;
}


int main()
{
        char *s, *s1, *s2;
        s = malloc(10);
        s1 = malloc(10);
        s2 = malloc(10);
        char *aux;
        scanf("%s%s%s", s, s1, s2);
        aux = my_replace(s, s1, s2);
        printf("%s\n", aux);
        return 0;
}

/*
 * Problema 5
 *
 */

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main()
{
        int n, i;
        char (*cuvinte_u)[20] = NULL, (*cuvinte)[20]; // un pointer la un sir de 20 caractere
        int *aparitii;
        scanf("%d\n", &n);
        cuvinte = (char (*)[20]) malloc(n * sizeof(char[20]));

        i = 0;
        while (i < n) {
                scanf("%s", cuvinte[i]);
                i++;
        }

        int dim = 4, unice = 0, k;
        cuvinte_u = (char (*)[20]) malloc(dim * sizeof(char[20]));
        aparitii = (int *) malloc(dim * sizeof(int));

        for (i = 0; i < n; i++) {
                int found = 0;                // variabila care va indica daca am gasit cuvantul in vectorul de aparitii unice

                for (k = 0; k < unice; k++) {
                        if (strcmp(cuvinte_u[k], cuvinte[i]) == 0) {
                                aparitii[k]++;
                                found = 1;
                        }
                }

                if (found != 1)       {       //in cazul in care vucantul nu a fost gasit in vectorul de valori unice
                        if (unice >= dim) {  //in cazul in care dimensiunea vectorului unic nu a ajuns la limita
                                dim *= 2;
                                aparitii = (int *) realloc(aparitii, dim * sizeof(int));
                                cuvinte_u = (char (*)[20]) realloc(cuvinte_u, dim * sizeof(char[20]));
                        }

                        strcpy(cuvinte_u[unice], cuvinte[i]);
                        aparitii[unice] = 1;
                        unice++;
                }
        }
        for (i = 0; i < unice; i++)    { //afisarea rezultatelor
                printf("%s %d\n", cuvinte_u[i], aparitii[i]);
        }
        //dealocare de memorie
        free(aparitii);
        free(cuvinte_u);
        free(cuvinte);
        return 0;
}

/*
 * Problema 6
 *
 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef char cuvant[20];

char **interclaseaza(int n1, cuvant *s1, int n2, cuvant *s2)
{
        char **x = (char **) malloc (sizeof(char *) * (n1 + n2));
        // nu alocam memorie pentru siruri => sizeof(char *), nu sizeof(cuvant)
        int k = 0, j, i;
        for (i = 0, j = 0; i < n1 && j < n2; )  
                if (strcmp(s1[i], s2[j]) <= 0)
                        x[k++] = s1[i++];
                else              
                        x[k++] = s2[j++];
        while (i < n1)
                x[k++] = s2[i++];
        while (j < n2)
                x[k++] = s1[j++];
        return x;
}



int main()
{
        int n1 = 10, n2 = 10, i;
        char **x;
        cuvant *s1 = malloc(sizeof(cuvant) * n1);
        cuvant *s2 = malloc(sizeof(cuvant) * n2);
        for (i = 0; i < 10; i++) {
                sprintf(s1[i], "%d", i);
                sprintf(s2[i], "%d", i);
        }
        x = interclaseaza(n1, s1, n2, s2);
        for (i = 0; i < n1; i++)
                printf("%s ", s1[i]);
        printf("\n");
        for (i = 0; i < n2; i++)
                printf("%s ", s2[i]);
        printf("\n");
        for (i = 0; i < n1 + n2; i++)
                printf("%s ", x[i]);
        printf("\n");
        free(s1);
        free(s2);
        free(x);
        return 0;
}