Форум программистов, компьютерный форум CyberForum.ru

Свертка повторяющихся подстрок по следующим правилам - C++

Восстановить пароль Регистрация
 
MK_9
0 / 0 / 0
Регистрация: 16.11.2011
Сообщений: 11
11.04.2012, 03:40     Свертка повторяющихся подстрок по следующим правилам #1
Помогите, не могу понять задание.
В заданной строке символов выполнить свертку повторяющихся подстрок по следующим правилам: а) несколько последовательных повторений одной и той же подстроки заменяются так: хххх на 4(х), уbcbcх на у2(bc)х; б) это правило можно применять дважды, например: 4(х)b4(х)b заменяется на 4(4(х)b).

Добавлено через 11 часов 24 минуты
Может у кого-нибудь подобное задание есть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2012, 03:40     Свертка повторяющихся подстрок по следующим правилам
Посмотрите здесь:

C++ Найти количество вхождений подстрок в строку
Подсчитать количество подстрок в текстовом файле C++
C++ Молниеносное нахождение подстрок
Подсчёт количества подстрок C++
Поиск подстрок C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
11.04.2012, 06:00     Свертка повторяющихся подстрок по следующим правилам #2
MK_9, А что не понятно? Есть текст, его нужно сделать меньше, но что бы потом можно было его восстановить. Например "qqqqqqqq" занимает 8 байт, что мешает нам написать "q" один раз и просто поставить отметку, что его нужно повторить 8 раз, то есть получится "8(q)" , а это уже 4 байта, сжатие в два раза ) . Однако повторения могут быть не одного символа а нескольких, например "qwqwqwqwqwqw", так же пишем 6(qw).
В итоге получаешь сжатый текст, но что мешает по этому тексту пройтись еще раз, ведь могут появиться новые повторяющиеся строки....и так, пока возможности для сжатия не исчерпаются.
MK_9
0 / 0 / 0
Регистрация: 16.11.2011
Сообщений: 11
15.04.2012, 12:49  [ТС]     Свертка повторяющихся подстрок по следующим правилам #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;
 
 
 void main(void)
{
    setlocale(0,"RUS");
    char h;
    cout <<"Здравствуйте"<< endl
        <<"Желаете начать работу, y/n? ";
    cin >> h;
    while (h!='n')
    {   
     int i=0, j=0;
     char *st = new char [512];
     char *st1 = new char [512];
     char *st2 = new char [512];
     cout <<"Введите строку: ";
     cin.get();
     cin.getline(st,255);
     int n=strlen(st);
 
      while (i < n)
      {
           if (st[i] == 'x' && st[i+1] == 'x' && st[i+2] == 'x' && st[i+3] == 'x')
           {
              st1[j] = '4';
              st1[j+1] = '(';
              st1[j+2] = 'x';
              st1[j+3] = ')';
              j = j+4;
              i = i+4;
           }
           if (st[i] == 'y' && st[i+1] == 'b' && st[i+2] == 'c' && st[i+3] == 'b'&& st[i+4] == 'c'&& st[i+5] == 'x') 
           {
              st1[j] = 'y';
              st1[j+1] = '2';
              st1[j+2] = '(';
              st1[j+3] = 'b';
              st1[j+4] = 'c';
              st1[j+5] = ')';
              st1[j+6] = 'x';
              j = j+7;
              i = i+7;
           }
         else
           {
              st1[j] = st[i];
              j=j+1;
              i=i+1;
           }
      }
      
          cout <<("Полученная строка:\n");
      st1[n]='\0';
          cout << st1 << endl;
      char t;
      cout <<"Применить правило дважды, y/n? ";
      cin >> t;
    while (t!='n')
    { ????
        if (st1[i] == '4' && st1[i+1] == '(' && st1[i+2] == 'x' && st1[i+3] == ')'&& st1[i+4] == 'b' && st1[i+5] == '4' && st1[i+6] == '(' && st1[i+7] == 'x' && st[i+8] == ')' && st1[i+9] == 'b') 
           {
              st2[j] = '4';
              st2[j+1] = '(';
              st2[j+2] = '4';
              st2[j+3] = '(';
              st2[j+4] = 'x';
              st2[j+5] = ')';
              st2[j+6] = 'b';
              st2[j+7] = ')';
              j = j+8;
              i = i+10;
           }
         else
           {
              st1[j] = st[i];
              j=j+1;
              i=i+1;
    }
    }
      cout << "Желаете повторить работу, y/n? ";
        cin >> h;
    }
}
Как повторно применить 4(х)b4(х)b заменяется на 4(4(х)b) ?
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
15.04.2012, 14:30     Свертка повторяющихся подстрок по следующим правилам #4
4(х)b4(х)b заменяется на 2(4(х)b) а у тебя в задании это опечатка
Yandex
Объявления
15.04.2012, 14:30     Свертка повторяющихся подстрок по следующим правилам
Ответ Создать тему
Опции темы

Текущее время: 00:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru