Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2014, 14:46   #1
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Радость Перевёртыши (TurboPascal)

Задан числовой массив a[n]. Найдите отрезок массива максимальной длины, в котором первое
число равно последнему, второе – предпоследнему и так далее.
Если подходящих отрезков несколько, выведите первый по порядку.

Формат ввода: первая строка: n. n ≤ 7000. Вторая строка: элементы массива.
-maxint ≤ a[i] ≤ maxint

Формат вывода: искомый отрезок.

input.txt
9
5 3 4 7 4 3 6 6 3

output.txt
3 4 7 4 3
VladKB1 вне форума Ответить с цитированием
Старый 12.06.2014, 15:44   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Нахождение палиндрома и максимального палиндрома - (С) Puporev
Код:
function palindrom(r:string):boolean;
var
  i:byte;
begin
  palindrom:=true;
  for i:=1 to length(r)div 2 do
    if (r[i]<>r[length(r)-i+1]) then
  palindrom:=false;
end;

var
  s,r,s1:string;
  i,j,mx:integer;
  f,g:text;

begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f);
  readln(f,s);
  val(s,i,j);
  s1:='';
  for j:=1 to i do
    begin
      read(f,mx);
      str(mx,s);
      s1:=s1+s;
    end;
  close(f);

  s:=s1;
  if length(s)<2 then
    r:=s
  else
    begin
      mx:=1;
    for i:=1 to length(s)-1 do
      for j:=i+1 to length(s) do
        begin
          s1:=copy(s,i,j-i+1);
          if palindrom(s1) and(j-i+1>mx) then
            begin
              mx:=j-i+1;
              r:=s1;
            end;
        end;
    end;

  writeln('Палиндром максимальной длины = ',r);
  rewrite(g);
  for i:=1 to length(r) do 
    write(g,r[i],' ');
  close(g);
  readln;

end.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 12.06.2014, 15:55   #3
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от ZX Spectrum-128 Посмотреть сообщение
Нахождение палиндрома и максимального палиндрома - (С) Puporev
Код:
function palindrom(r:string):boolean;
var
  i:byte;
begin
  palindrom:=true;
  for i:=1 to length(r)div 2 do
    if (r[i]<>r[length(r)-i+1]) then
  palindrom:=false;
end;

var
  s,r,s1:string;
  i,j,mx:integer;
  f,g:text;

begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f);
  readln(f,s);
  val(s,i,j);
  s1:='';
  for j:=1 to i do
    begin
      read(f,mx);
      str(mx,s);
      s1:=s1+s;
    end;
  close(f);

  s:=s1;
  if length(s)<2 then
    r:=s
  else
    begin
      mx:=1;
    for i:=1 to length(s)-1 do
      for j:=i+1 to length(s) do
        begin
          s1:=copy(s,i,j-i+1);
          if palindrom(s1) and(j-i+1>mx) then
            begin
              mx:=j-i+1;
              r:=s1;
            end;
        end;
    end;

  writeln('Палиндром максимальной длины = ',r);
  rewrite(g);
  for i:=1 to length(r) do 
    write(g,r[i],' ');
  close(g);
  readln;

end.
Конечно спасибо за решение, но нельзя пользоваться функциями,типом переменных string. Извините что сразу не написал
VladKB1 вне форума Ответить с цитированием
Старый 12.06.2014, 16:20   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
  L:=0;
  for i:=1 to n do
    for j:=n downto i do begin
      Equ:=True;
      for k:=i to i+((j-i) div 2) do Equ:=Equ and (a[k]=a[j+i-k]);
      if Equ and (L<j-i+1) then begin L:=j-i+1; P:=i; end;
    end;
P - инднекс начала палиндрома в массиве
L - длина палиндрома
a - array [1..n]
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.06.2014, 16:46   #5
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Печаль

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
  L:=0;
  for i:=1 to n do
    for j:=n downto i do begin
      Equ:=True;
      for k:=i to i+((j-i) div 2) do Equ:=Equ and (a[k]=a[j+i-k]);
      if Equ and (L<j-i+1) then begin L:=j-i+1; P:=i; end;
    end;
P - инднекс начала палиндрома в массиве
L - длина палиндрома
a - array [1..n]
Большое вам спасибо , но длина палиндрома у меня равна 1. Как исправить?

Код:
.... 
for i:=1 to n do
 for j:=n downto i do
 begin
  q:=True;
  for u:=i to i+((j-i) div 2) do
  q:=q and (a[u]=a[j+i+u]);

  if q and (l<j-i+1) then
  begin
   l:=j-i+1;
   P:=i;
  end;
 end;
 write(a[p],' ');
 for i:=1 to l do write(a[p+i],' ');
end.
Я дал l другое значение не может ли быть ошибки на других тестах?

Код:
...
 l:=((n-1) div 2);
...

Последний раз редактировалось VladKB1; 12.06.2014 в 16:51.
VladKB1 вне форума Ответить с цитированием
Старый 12.06.2014, 16:58   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Я дал l другое значение не может ли быть ошибки на других тестах?
Обязательно. Сначала правильно мой код примени. Как минимум еще одна ошибка есть. И цикл выдачи палиндрома не правильный
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.06.2014 в 17:01.
Аватар вне форума Ответить с цитированием
Старый 12.06.2014, 17:10   #7
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Вопрос

Цитата:
Сообщение от Аватар Посмотреть сообщение
Обязательно. Сначала правильно мой код примени. Как минимум еще одна ошибка есть. И цикл выдачи палиндрома не правильный
я изменил правильно?


Код:
 ...
  if q and (l<j-i+1) then
  begin
   l:=j-i+1;
   P:=i;
  end;
 end;
 for i:=p to n-p-l do write(a[i],' ');
end.
VladKB1 вне форума Ответить с цитированием
Старый 12.06.2014, 17:18   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код есть, сравнивай. Или слабо? А выдать так можно
Код:
for i:=P to P+L-1 do write(a[i],' ');
От пробела в конце сам избавляйся
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.06.2014, 17:33   #9
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Сообщение

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код есть, сравнивай. Или слабо? А выдать так можно
Код:
for i:=P to P+L-1 do write(a[i],' ');
От пробела в конце сам избавляйся
При такой записи мы делам цикл от 2 до 2! Я написал так и всё работает:

Код:
for i:=p to n-p-2 do write(a[i],' ');
 writeln(a[n-p-1]);
Но всё же спасибо за помощь! P.S если не заняты помогите с этой задачей http://programmersforum.ru/showthread.php?t=262568

Последний раз редактировалось VladKB1; 12.06.2014 в 17:35.
VladKB1 вне форума Ответить с цитированием
Старый 12.06.2014, 21:43   #10
SlavaSSU
Пользователь
 
Регистрация: 15.04.2012
Сообщений: 46
По умолчанию

это же кубическое решение, не? оно в ограничение по времени влезло?
НИУ СГУ им. Чернышевского
SlavaSSU вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан текст.Найти все палиндромы(слова-перевёртыши)в етом тексте НЕМО170792 Помощь студентам 6 18.06.2011 23:21
turboPascal masterlomaster Помощь студентам 1 26.04.2011 19:45
TurboPascal masterlomaster Помощь студентам 0 26.04.2011 15:36
TurboPascal - help! Lexone Помощь студентам 5 29.03.2009 15:38