IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> поиск в строке, помигите найти ошибку
сообщение
Сообщение #21


Гость






Что-то меня терзают сомнения, что это правильно, но все-таки потестируй на ВСЕХ своих тестах:
function maxChain(s: string; len: integer): integer;
var
i: integer;
arr: array[1 .. 255] of byte;

begin
for i := 1 to 255 do arr[i] := 255;
arr[1] := 1;
for i := 2 to length(s) do
begin
if pos(s[i], s) < i then arr[i] := arr[i - 1]
else arr[i] := arr[i - 1] + 1;
end;

i := 0;
repeat
inc(i)
until arr[i + 1] > len;

maxChain := i;
end;

var s: string;
begin
s := 'adeeadfcce';
writeln(maxChain(s, 4));
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Проснулся сегодня и понял, что в моём коде сортировка неправильная. Так лучше:

var s:string;
i,j,m,ind,mnind,count:byte;
sym:array [1..255] of byte;
mn:array[1..255] of char;

function check(c:char):boolean;
var u:byte;
begin
check:=false;
for u:=1 to mnind do if c=mn[u] then begin
check:=true;
break;
end;
end;

begin
writeln('Vvedite Stroku');
readln(s);
writeln('Vvedite M');
readln(m);
fillchar(sym,sizeof(byte)*length(s),0);
fillchar(mn,sizeof(char)*length(s),#0);
ind:=0;mnind:=0;
for i:=1 to length(s) do begin
if not(check(s[i])) then begin
inc(ind);inc(mnind);
for j:=1 to length(s) do if s[j]=s[i] then inc(sym[ind]);
end;
mn[mnind]:=s[i];
end;
for i:=1 to ind-1 do begin
for j:=i+1 to ind do begin
if sym[i]>sym[j] then begin
count:=sym[j];
sym[j]:=sym[i];
sym[i]:=count;
end;
end;
end;
count:=0;
for i:=1 to m do begin
inc(count,sym[ind]);
dec(ind);
end;
writeln('Maxlength=',count);
readln;
end.




--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


спасибо,volvo, но оно действительно неправильно вычисляет.
s := aaaabbccccc;
m := 1;
А значение функции 4.

Unconnected, а может все-такие проставить пожалуйста комментарии?


Добавлено через 2 мин.
Блин..
volvo, а можешь объяснить что ты делал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +



var s:string;
i,j,m,ind,mnind,count:byte;
sym:array [1..255] of byte; //массив, в каждой ячейке которого содержится количество вхождений в строку
//некого символа
mn:array[1..255] of char; //массив, в котором хранятся уже посчитанные символы.

function check(c:char):boolean; //проверка символа на то, считали ли уже количество его вхождений в строку
var u:byte;
begin
check:=false;
for u:=1 to mnind do if c=mn[u] then begin
check:=true;
break;
end;
end;

begin
writeln('Vvedite Stroku');
readln(s);
writeln('Vvedite M');
readln(m);
fillchar(sym,sizeof(byte)*length(s),0); // инициализация обоих массивов
fillchar(mn,sizeof(char)*length(s),#0);//
ind:=0;mnind:=0; //и переменных
for i:=1 to length(s) do begin //бежим по строке
if not(check(s[i])) then begin //если ещё не считали количество вхождений очередного элемента, то посчитаем
inc(ind);inc(mnind);
for j:=1 to length(s) do if s[j]=s[i] then inc(sym[ind]); //бежим по строке и считаем вхождения
end;
mn[mnind]:=s[i]; //заносим в массив элемент,вхождения которого считали, чтобы не считать их снова, если
//он встретится опять
end;
for i:=1 to ind-1 do begin //в каждой ячейке массива sym содержится количество вхождений какого-то
for j:=i+1 to ind do begin //элемента. Какого, нам не важно. Сортируем этот массив, "пузырьком".
if sym[i]>sym[j] then begin
count:=sym[j];
sym[j]:=sym[i];
sym[i]:=count;
end;
end;
end;
count:=0;
for i:=1 to m do begin //отсортировали. Длины в массиве syn хранятся по возрастанию, нам надо взять
inc(count,sym[ind]); // M самых больших. Идём с конца (заметь, чему равно ind здесь) и суммируем эти
dec(ind); //элементы в count.
end;
writeln('Maxlength=',count);
readln;
end.



--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


Unconnected, cпасибо большое. буду разбираться..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


Честно говоря, все равно что-то неверно
Потому как
s = aaaabbbccccc
m= 2
Ответ 9.
А должен быть 8
(bbbccccc)

Добавлено через 8 мин.
Или я, или ты неправильно поняли задание
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Цитата
s = aaaabbbccccc
m= 2
Ответ 9.
А должен быть 8
(bbbccccc)


Ответ должен быть 9, aaaaccccc .


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


я поняла почему 9. прото мне казалось, что символы должны подряд стоять...
то есть
Так aaaa bbbccccc ответ 8;
А так aaaacccccbbb 9;
А этого в самом задании не написано. Только то, что написала.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Гость






Цитата
прото мне казалось, что символы должны подряд стоять...
Правильно казалось. Символы должны стоять именно подряд, это то, что записано в задании:
Цитата
которая вычисляет длину самой длинной m-знаковой строки, которая содержится в строке s.
Не "состоит из символов, из которых состоит s", а "содержится в s", понимаешь? Содержится - значит целиком: bca - содержится в abcabc, а bcb - уже нет...

Update
Вот это:
function maxChain(s: string; len: integer): integer;
var
i, offset, max: integer;
subs: string;
begin
max := 0;
for i := 1 to length(s) do
begin
offset := 0; subs := '';
while (i + offset <= length(s)) do
begin
if pos(s[i + offset], subs) > 0 then inc(offset)
else begin
subs := subs + s[i + offset];
if length(subs) > len then break;
inc(offset);
end;
end;

if max < offset then max := offset;
end;

maxChain := max;
end;

var
s: string;
begin
s := 'aaaabbbccccc'; // m = 2; => 8
// s := 'adeeadfcce'; // m = 4; => 7
// s := 'accaeadad'; // m = 3; => 6
// s := 'aaaabbccccc'; // m = 1; => 5
writeln(maxChain(s, 2));
end.
выдает ожидаемые результаты на всех тестах, которые ты здесь приводила...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


Цитата(volvo @ 24.03.2010 12:26) *

Правильно казалось. Символы должны стоять именно подряд, это то, что записано в задании:
Не "состоит из символов, из которых состоит s", а "содержится в s", понимаешь? Содержится - значит целиком: bca - содержится в abcabc, а bcb - уже нет...


Логично...
Спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


Тольконе совсем поняла что ты делал с Max.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Гость






Искал наибольшее, что и требовалось... На каждой итерации в Offset получаем количество символов в M-буквенном слове, которое начинается с I-той позиции строки. Если среди всех Offset-ов найдем максимальный, то получим то, что требовалось в задаче: длину максимального М-буквеного слова.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Пионер
**

Группа: Пользователи
Сообщений: 99
Пол: Женский
Реальное имя: vera

Репутация: -  0  +


Всё, поняла. спасибо большое.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 8:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name