Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #define LEN 1234
- #define ASCII_LEN 256
- void clean_string(char *s, int n) {
- memset(s, 0, n);
- }
- int solve(char **a, int n) {
- int i, shifted_i, flag = 0;
- char *c;
- char hash[ASCII_LEN];
- // Нулевая итерация
- clean_string(hash, ASCII_LEN);
- for (c = a[0]; *c; c++) {
- hash[(int) *c] = 1;
- }
- // Идем по массиву
- for (i = 1, shifted_i = 0; i < n; i++) {
- // Проверяем совпадения букв через хеш таблицу
- for (c = a[i]; *c; c++) {
- if ((int)hash[(int) *c] == 1) {
- flag = 1;
- break;
- }
- }
- // Заполняем хеш-таблицу текущего элемента, сначала чистя его
- clean_string(hash, ASCII_LEN);
- for (c = a[i]; *c; c++) {
- hash[(int) *c] = 1;
- }
- // Если буквы не совпадали (flag == 0), то никаких пертираний не будет
- if (flag == 0) {
- shifted_i++;
- a[shifted_i] = a[i];
- }
- // Готовим переменные к след итерации
- flag = 0;
- }
- shifted_i++;
- a[shifted_i] = a[i];
- return shifted_i;
- }
- int main(void) {
- int i, j, n;
- const char * input = "input.txt";
- const char * output = "output.txt";
- FILE * fpin, * fpout;
- char buf[LEN];
- char ** a;
- if (!(fpin = fopen(input, "r"))) {
- return -1;
- }
- if (fscanf(fpin, "%d\n", & n) != 1) {
- printf("Ошибка чтения\n");
- return 1;
- }
- a = (char ** ) malloc(n * sizeof(char * ));
- if (!a) {
- printf("Недостаточно памяти\n");
- return 1;
- }
- for (j = 0; j < n; j++) {
- if (!fgets(buf, LEN, fpin))
- break;
- for (i = 0; buf[i]; i++) {
- if (buf[i] == '\n') {
- buf[i] = 0;
- break;
- }
- }
- a[j] = (char * ) malloc(i * sizeof(char));
- strcpy(a[j], buf);
- }
- if (!feof(fpin)) {
- fclose(fpin);
- return -3;
- }
- fclose(fpin);
- n = solve(a, n);
- if (!(fpout = fopen(output, "w"))) {
- return -1;
- }
- for (j = 0; j < n; j++) {
- fprintf(fpout, "%s", a[j]);
- fprintf(fpout, "%s", "\n");
- }
- fclose(fpout);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement