Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
1

Поиск всех вхождений шаблона в строку

21.06.2010, 00:31. Показов 6094. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,хотела к вам обратиться за помощью..в файле t.txt есть строка из символов букв латинского алфавита,длиной до 100000 знаков. Так же в текстовом файле s.txt задаётся шаблон, в котором кроме букв латинского алфавита может присутствовать знак "*",который в свою очередь равен либо пробелу,либо произвольным буквам лат.алфавита.Длина шаблона до 20 символов.Подсчитать все возможные вхождения шаблона в строку.Ответ записать в файл.
Как читать файл,разбивать на символы я примерно знаю,но вот как сделать так,чтобы звёздочка заменяла любую комбинацию символов нет..Очень надеюсь на вашу скорую помощь*))
P.S.:шаблон можно вводить и с консоли,чтобы не усложнять задачу с считыванием символов))

Добавлено через 4 часа 58 минут
хотя бы какие функции использовать для реализации???Подскажите пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2010, 00:31
Ответы с готовыми решениями:

Поиск всех вхождений подстроки в строку
Здравствуйте, помогите пожалуйста со следующей задачей. Имеется переменная, в которую загружен...

Поиск всех вхождений
Здравствуйте, нужна ваша помощь. у меня есть примерно следующий html код: <p...

Количество вхождений всех символов в строку
Видел похожую тему, но там задача была проще, так как надо было найти конкретный символ. В моем...

Последовательный поиск всех вхождений
Необходимо реализовать алгоритм последовательного поиска всех вхождений в заданном тексте. То есть,...

20
10 / 10 / 2
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
21.06.2010, 01:30 2
а что есть уже из наработанного?


вот функция поиска https://www.cyberforum.ru/post817460.html
1
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
21.06.2010, 02:09  [ТС] 3
есть программа поиска шаблона в тексте,но в maple..и она правда тоже не до конца доработана..вся загвоздка в "*"...я просто не сильна в си/си++..я на первом курсе изучала только паскаль..а потом перевелась..и с изучением новых языков есть сложности..
0
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
22.06.2010, 14:15  [ТС] 4
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
 
int main(int argc, char *argv[])
{
 
int filedes_t; 
int filedes_p; 
ssize_t nread;
ssize_t rread;
char text[1050000]; // ïîñëåäîâàòëüíîñòü
char pattern[30]; // ïîäïîñëåäîâàòåëüíîñòü
char *pref, *suf;
 
if (argc != 3) {
printf("input 2 argument - ./filename text pattern\n");
return 1;
}
 
if ((filedes_p = open(argv[2], O_RDONLY)) == -1) {
printf("cant open pattern file\n");
return 1;
}
 
if ((filedes_t = open(argv[1], O_RDONLY)) == -1) {
printf("cant open text file\n");
return 1;
}
 
if ((rread = read(filedes_p, pattern, 30)) == -1) {
printf("ERROR read pattern\n");
return 1;
}
 
if ((nread = read(filedes_t, text, 1000000)) == -1) {
printf("ERROR read text\n");
return 1;
}
void main(){
pref = strtok_r(pattern, "*", &suf);
printf ("%s\n", pref);
printf ("%s\n", suf);
 
long int[] n, m;
int i,j,p,l;
for (i=0;i<strlen(text);i++)
{
n[i]=strstr_cnt(text,pref);
printf("%d \n",n[i]);
}
for (j=0;j<strlen(text);j++)
{
m[j]=strstr_cnt(text,suf);
printf("%d \n",m[j]);
}
p=sizeof(n[i]);
l=sizeof(m[j]);
for(i=0; i<p; i++)
for(j=0; j<l; j++)
if(n[i]+strlen(pref)< m[j])
printf("íàøëè âõîæäåíèå ñ %d ïî %d\n", n[i], m[j]+strlen(suf)); 
}
}
В чём тут ошибка?почему метод strtok_r при компиляции выдаёт ошибку,а от туда и дальше прога не ладится(((((((((((Мои наработки
0
Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
22.06.2010, 14:56 5
а какая выдается ошибка
0
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
22.06.2010, 22:19  [ТС] 6
выдает ошибку :[Warning] assignment makes pointer from integer without a cast
я ещё немного код передела..и снова вылезла уйма ошибок((

Добавлено через 1 минуту
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
 
int main(int argc, char *argv[])
{
 
int filedes_t; 
int filedes_p; 
ssize_t nread;
ssize_t rread;
char text[1050000]; // ïîñëåäîâàòëüíîñòü
char pattern[30]; // ïîäïîñëåäîâàòåëüíîñòü
char *pref, *suf;
 
if (argc != 3) {
printf("input 2 argument - ./filename text pattern\n");
return 1;
}
 
if ((filedes_p = open(argv[2], O_RDONLY)) == -1) {
printf("cant open pattern file\n");
return 1;
}
 
if ((filedes_t = open(argv[1], O_RDONLY)) == -1) {
printf("cant open text file\n");
return 1;
}
 
if ((rread = read(filedes_p, pattern, 30)) == -1) {
printf("ERROR read pattern\n");
return 1;
}
 
if ((nread = read(filedes_t, text, 1000000)) == -1) {
printf("ERROR read text\n");
return 1;
}
pref = strtok_r(pattern, "*", &suf);
printf ("%s\n", pref);
printf ("%s\n", suf);
 
int strstr_cnt(const char *Src,const char *Sub)
{
  int count = 0;
  long int len = strlen(Src);
  for (int i=0; i<len; i++)
  {
    if(Sub[0]==Src[i])
    {
    bool is = true;
    for(int j=0; j<strlen(Sub); j++)
    if(i+j<len)
    {
                 if(Sub[j]!=Src[i+j]) is=false;
    }
    else is=false;
    if(is) count++;
     }
  }
  return count;
}
long int[] n, m;
int i,j,p,j;
for (i=0;i<strlen(text);i++)
{
 n[i]=strstr_cnt(text,pref);
    printf("%d \n",n[i]);
}
    for (j=0;j<strlen(text);j++)
    {
     m[j]=strstr_cnt(text,suf);
     printf("%d \n",m[j]);
        }
p=sizeof(n[i]);
l=sizeof(m[j]);
      for(i=0; i<p; i++)
for(j=0; j<l; j++)
if(n[i]+strlen(pref)< m[j])
printf("íàøëè âõîæäåíèå ñ %d ïî %d\n", n[i], m[j]+strlen(suf));  
}
}
0
Light Knight
106 / 29 / 5
Регистрация: 03.06.2010
Сообщений: 361
22.06.2010, 22:20 7
а нужен с или с++?
0
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
22.06.2010, 22:22  [ТС] 8
С..ошиблась с выбором кода в выделении)..ну если другую прогу делать,то без разницы..)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.06.2010, 08:42 9
C
1
int strstr_cnt(const char *Src,const char *Sub)
эта функция не может быть в функции main(), её всю нужно вынести наружу
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.06.2010, 16:35 10
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
//Задаётся шаблон, в котором кроме букв латинского алфавита может присутствовать 
//знак "*", который в свою очередь равен либо пробелу,либо произвольным буквам 
//лат. алфавита. Подсчитать все возможные вхождения шаблона в строку. 
//Шаблон можно вводить и с консоли.
 
//==================================================================================
//  Программа ведет поиск соответствия шаблону слева направо с каждой позиции строки.
//  Для подстановки текста вместо звездочки используется ленивый алгоритм.
//==================================================================================
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
 
typedef std::string       T_str;
typedef T_str::size_type  T_pos;
 
int  get_chislo_vxozhdeniy_shablona_v_str
    (
        T_str pattern,
        T_str str        
    )
{
    std::cout << std::endl;
 
    const char  METASYMBOL         = '*';
    int         metasymbols_total  = std::count
                                     (pattern.begin(), pattern.end(), METASYMBOL);
 
    if(metasymbols_total > 1)  return 0;    
    if(metasymbols_total == 0) pattern += METASYMBOL;
 
    T_pos  metasymbol_pos  = pattern.find(METASYMBOL);
    T_str  pref            = pattern.substr(0, metasymbol_pos);
    T_str  suf             = pattern.substr(metasymbol_pos + 1);
    int    count           = 0;
 
    for(T_pos  pref_find_pos = 0;; ++count)    
    {
        T_pos  pref_pos = str.find(pref, pref_find_pos);
        if(pref_pos == T_str::npos) break; 
 
        T_pos  suf_find_pos  = pref_pos + metasymbol_pos;
        T_pos  suf_pos       = str.find(suf, suf_find_pos);
 
        if(suf_pos == T_str::npos) break;                
        pref_find_pos = pref_pos + 1;        
        std::cout << "Позиция в строке "
                  << std::setw(2)
                  << pref_pos
                  << ": "                  
                  << str.substr(pref_pos, suf_pos + suf.length() - pref_pos)
                  << std::endl;
    }
    return count;
}
 
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите строку:" 
              << std::endl;
    T_str str;
    getline(std::cin, str);
    std::cout << "Введите шаблон:"               
              << std::endl;
    T_str pattern;
    getline(std::cin, pattern);
    
    std::cout << "Число вхождений шаблона в строку равно "
              << get_chislo_vxozhdeniy_shablona_v_str(pattern, str)
              << "."
              << std::endl;   
    return 0;
}
1
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
23.06.2010, 22:08  [ТС] 11
спасибо огромное..)))правда есть одна беда,видимо у меня с компиляторм..не удаётся посмотреть результат(((
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.06.2010, 22:29 12
Цитата Сообщение от Solnechnayanny Посмотреть сообщение
спасибо огромное..)))правда есть одна беда,видимо у меня с компиляторм..не удаётся посмотреть результат(((
В смысле?
0
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
24.06.2010, 01:39  [ТС] 13
окно сразу закрывается после ввода шаблона..у меня программа Bloodshed dev-c++

Добавлено через 44 минуты
ответ я увидела,но задача считает не все возможные вхождения...к примеру для acacbcbc,шаблон ac*bc входит в строку 4 раза:acacbc;acacbcbc,acbc,acbcbc.А прога находит лишь acacbc;acbc=(((
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.06.2010, 02:31 14
Цитата Сообщение от Solnechnayanny Посмотреть сообщение
окно сразу закрывается после ввода шаблона..у меня программа Bloodshed dev-c++

Добавлено через 44 минуты
ответ я увидела,но задача считает не все возможные вхождения...к примеру для acacbcbc,шаблон ac*bc входит в строку 4 раза:acacbc;acacbcbc,acbc,acbcbc.А прога находит лишь acacbc;acbc=(((
Так вы наверно это еще не читали:
https://www.cyberforum.ru/cpp-... 10807.html
Мне легче, у меня в Visual Studio ничего никуда не исчезает.

А насчет подстрок - вы уже определитесь что вам нужно. В примере, который вы приводили в параллельной теме, с каждой позиции строки вычислялась подстрока по ленивому алгоритму, т.е. наименьшая из возможных. А здесь вы предлагаете с каждой позиции вычислять одновременно и по ленивому и по жадному алгоритму. Те примеры вы откуда взяли? Если вам преподаватель дал, то моя программа по ним сделана и их выполняет. Если нужно что-то другое, то нужно четче формулировать.
0
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
24.06.2010, 02:39  [ТС] 15
извините,если не смогла до вас донести суть задания..не всегда получается его чётко сформулировать ...те примеры взяты с головы,чтобы более или менее объяснить,что мне нужно..преподаватель дал 2 пример)каким алгоритмом решать я не знаю,но предполагаю,что жадным..я пыталась разбить шаблон на префикс и суффикс,а затем отдельно найти вхождения того и другого..а затем выбрать те пары,где ac находится перед bc..надеюсь теперь стало понятнее
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.06.2010, 02:59 16
Мне понятно, что условия задачи вам самой пока непонятны, и вам надо уточнить их с преподавателем.
А где пример, который дал преподаватель?
0
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
24.06.2010, 03:00  [ТС] 17
строка acacbcbc,шаблон ac*bc,ответ я написала.И метод решения,который я привела является правильным.Просто я предполагаю,что существуют разные способы решения этой задачи.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.06.2010, 03:10 18
Т.е. он предлагает искать с каждой позиции строки все возможные подстроки. Можно и так сделать, только тогда если, скажем, у вас вначале строки длиной 100000 стоит буква z, и задан шаблон «z*», то первое соответствие будет вся строка, второе - строка без последнего символа, и так сто тысяч раз.
0
1 / 1 / 0
Регистрация: 20.06.2010
Сообщений: 43
24.06.2010, 03:12  [ТС] 19
видимо так..также он упоминал алгоритм shift-or,правда я в нём так и не смогла разобраться=(
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.06.2010, 12:24 20
Итак, возможны три способа поиска соответствующих шаблону подстрок с каждой позиции строки:
1. Искать минимально возможную подстроку (ленивый алгоритм);
2. Искать максимально возможную подстроку (жадный алгоритм);
3. Искать все возможные подстроки.

Мое решение первым способом приведено выше.

Добавлено через 2 минуты
Программа, отыскивающая максимально возможную подстроку (жадный алгоритм):
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
88
89
90
91
92
93
94
95
96
97
98
//Задаётся шаблон, в котором кроме букв латинского алфавита может присутствовать 
//знак "*", который в свою очередь равен либо пробелу,либо произвольным буквам 
//лат. алфавита. Подсчитать все возможные вхождения шаблона в строку. 
//Шаблон можно вводить и с консоли.
 
//==================================================================================
//  Программа ведет поиск соответствия шаблону слева направо с каждой позиции строки.
//  Для подстановки текста вместо звездочки используется жадный алгоритм.
//==================================================================================
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
 
typedef std::string       T_str;
typedef T_str::size_type  T_pos;
 
int  get_chislo_vxozhdeniy_podstrok_v_str
    (
        T_str substr,
        T_str str        
    )
{
    int count = 0;
    for(T_str::size_type  substr_find_pos = 0;; ++count)
    {
        T_str::size_type  substr_pos = str.find(substr, substr_find_pos);        
        if(substr_pos == T_str::npos) break;                
        substr_find_pos = substr_pos + 1;
        std::cout << "Позиция в строке "
                  << std::setw(2)
                  << substr_pos
                  << ": " 
                  << substr
                  << std::endl;
    }
    return count;
}
 
int  get_chislo_vxozhdeniy_shablona_v_str
    (
        T_str pattern,
        T_str str        
    )
{
    std::cout << std::endl;
 
    const char  METASYMBOL         = '*';
    int         metasymbols_total  = std::count
                                     (pattern.begin(), pattern.end(), METASYMBOL);
 
    if(metasymbols_total > 1)  return 0;    
    if(metasymbols_total == 0)
    {
        return get_chislo_vxozhdeniy_podstrok_v_str(pattern, str);
    }
 
    T_pos  metasymbol_pos  = pattern.find(METASYMBOL);
    T_str  pref            = pattern.substr(0, metasymbol_pos);
    T_str  suf             = pattern.substr(metasymbol_pos + 1);
    int    count           = 0;
 
    for(T_pos  pref_find_pos = 0;; ++count)    
    {
        T_pos  pref_pos = str.find(pref, pref_find_pos);
        if(pref_pos == T_str::npos) break; 
        T_pos  suf_pos = str.rfind(suf);
        if(suf_pos == T_str::npos
           || suf_pos < pref_pos + metasymbol_pos) break;                
        pref_find_pos = pref_pos + 1;        
        std::cout << "Позиция в строке "
                  << std::setw(2)
                  << pref_pos
                  << ": "                  
                  << str.substr(pref_pos, suf_pos + suf.length() - pref_pos)
                  << std::endl;
    }
    return count;
}
 
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите строку:" 
              << std::endl;
    T_str str;
    getline(std::cin, str);
    std::cout << "Введите шаблон:"               
              << std::endl;
    T_str pattern;
    getline(std::cin, pattern);
    
    std::cout << "Число вхождений шаблона в строку равно "
              << get_chislo_vxozhdeniy_shablona_v_str(pattern, str)
              << "."
              << std::endl;   
    return 0;
}
Добавлено через 2 минуты
Программа, отыскивающая все возможные подстроки:
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//Задаётся шаблон, в котором кроме букв латинского алфавита может присутствовать 
//знак "*", который в свою очередь равен либо пробелу,либо произвольным буквам 
//лат. алфавита. Подсчитать все возможные вхождения шаблона в строку. 
//Шаблон можно вводить и с консоли.
 
//==================================================================================
//  Программа ведет поиск соответствия шаблону по строке слева направо, 
//  и с каждой позиции строки отыскивает все возможные подстроки, 
//  соответствующие шаблону.
//==================================================================================
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
 
typedef std::string       T_str;
typedef T_str::size_type  T_pos;
 
int  get_chislo_vxozhdeniy_podstrok_v_str
    (
        T_str substr,
        T_str str        
    )
{
    int count = 0;
    for(T_str::size_type  substr_find_pos = 0;; ++count)
    {
        T_str::size_type  substr_pos = str.find(substr, substr_find_pos);        
        if(substr_pos == T_str::npos) break;                
        substr_find_pos = substr_pos + 1;
        std::cout << "Позиция в строке "
                  << std::setw(2)
                  << substr_pos
                  << ": " 
                  << substr
                  << std::endl;
    }
    return count;
}
 
int  get_chislo_vxozhdeniy_shablona_v_str
    (
        T_str  pattern,
        T_str  str        
    )
{
    std::cout << std::endl;
 
    const char  METASYMBOL         = '*';
    int         metasymbols_total  = std::count
                                     (pattern.begin(), pattern.end(), METASYMBOL);
 
    if(metasymbols_total > 1)  return 0;    
    if(metasymbols_total == 0)
    {
        return get_chislo_vxozhdeniy_podstrok_v_str(pattern, str);
    }
 
    T_pos  metasymbol_pos  = pattern.find(METASYMBOL);
    T_str  pref            = pattern.substr(0, metasymbol_pos);
    T_str  suf             = pattern.substr(metasymbol_pos + 1);
    int    count           = 0;
 
    for(T_pos  pref_find_pos = 0; ; )    
    {
        T_pos  pref_pos = str.find(pref, pref_find_pos);
        if(pref_pos == T_str::npos) break;
 
        for(T_pos  suf_find_pos  = pref_pos + metasymbol_pos; ; ++count)
        {
            T_pos  suf_pos = str.find(suf, suf_find_pos);
            if(suf_pos == T_str::npos)
            {
                pref_find_pos = pref_pos + 1;
                break;
            }                    
            std::cout << "Позиция в строке "
                      << std::setw(2)
                      << pref_pos
                      << ": "                  
                      << str.substr(pref_pos, suf_pos + suf.length() - pref_pos)
                      << std::endl;            
            suf_find_pos = suf_pos + 1;
        }        
    }
    return count;
}
 
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите строку:" 
              << std::endl;
    T_str str;
    getline(std::cin, str);
    std::cout << "Введите шаблон:"               
              << std::endl;
    T_str pattern;
    getline(std::cin, pattern);
    
    std::cout << "Число вхождений шаблона в строку равно "
              << get_chislo_vxozhdeniy_shablona_v_str(pattern, str)
              << "."
              << std::endl;   
    return 0;
}
1
24.06.2010, 12:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2010, 12:24
Помогаю со студенческими работами здесь

Поиск всех вхождений текстовой строки
Здраствуйте. Нужна помощь в написании программы на Haskell результатом работы которой будет: Все...

Поиск количества вхождений символов в строку
Доброго времени суток! Помогите, пожалуйста с задачкой! Нужно ввести строку с клавиатуры и...

Парсинг HTML - поиск всех вхождений текста
Приветствую. Достаю html код нужной страницы вот таким образом: Imports System.Net Imports...

Двоичный поиск в массиве ВСЕХ вхождений искомого элемента
У Вики есть такой чудесный код: def check(x, m): return x &lt; m def binSearch(lst, x): #...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru