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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2014, 22:16   #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


Не проходит 14 тест по времени (1 тест = 1 секунда ,а у меня 85 сек (( )

Код:
var
 n,i,j,p,l,x,u: longint;
 q: boolean;
 a: array [1..7000] of longint;
begin
 assign(input,'input.txt');
 reset(input);
 assign(output,'output.txt');
 rewrite(output);

 read(n);
 for i:=1 to n do read(a[i]);

 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;
 for i:=p to p+l-2 do write(a[i],' ');
 writeln(a[p+l-1]);
end.
VladKB1 вне форума Ответить с цитированием
Старый 17.06.2014, 22:26   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Массив сделать массивом integer и заменить
Код:
for u:=i to i+((j-i) div 2) do
q:=q and (a[u]=a[j+i-u]);
на
Код:
u := i;
tmp := i + ((j - i) div 2);
while q and (u <= tmp) do
begin
  q := a[u] = a[j + i - u];
  inc(u);
end;
Но не гарантирую, что это намного ускорит.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2014, 22:33   #3
SlavaSSU
Пользователь
 
Регистрация: 15.04.2012
Сообщений: 46
По умолчанию

хахах. говорил же я, не пройдет по времени!)))
а вообще надо решать задачу за O(n^2);

короче вот на с++, там сам разберешься
Код:
int ansl, ansr;
int ans = 0;

for(int i = 1; i <= n; i++)
{
int cur = 1;
int l = i - 1, r = i + 1;
while(l >= 1 && r <= n && a[l] == a[r])
{
l--;
r++;
cur += 2;
}

if(cur > ans)
{
ans = cur;
ansl = ++l;
ansr = --r;
}
}

for(int i = 1; i <= n; i++)
{
int cur = 0;
int l = i - 1, r = i;
while(l >= 1 && r <= n && a[l] == a[r])
{
l--;
r++;
cur += 2;
}

if(cur > ans)
{
ans = cur;
ansl = ++l;
ansr = --r;
}
}
теперь в ansl и ansr хранятся границы макс подстроки палиндрома
НИУ СГУ им. Чернышевского

Последний раз редактировалось Stilet; 18.06.2014 в 07:58.
SlavaSSU вне форума Ответить с цитированием
Старый 17.06.2014, 23:01   #4
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Массив сделать массивом integer и заменить
Код:
for u:=i to i+((j-i) div 2) do
q:=q and (a[u]=a[j+i-u]);
на
Код:
u := i;
tmp := i + ((j - i) div 2);
while q and (u <= tmp) do
begin
  q := a[u] = a[j + i - u];
  inc(u);
end;
Но не гарантирую, что это намного ускорит.
а вот тут давать значение P и L ?

Код:
begin
  q := a[u] = a[j + i - u];
  inc(u);
end;
VladKB1 вне форума Ответить с цитированием
Старый 17.06.2014, 23:51   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

VladKB1, заменить в коде только 2 указанные строки (и тип элементов массива), а всё остальное оставить как есть. Да и способ SlavaSSU можно попробовать.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.06.2014, 00:09   #6
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

BDA Большое спасибо теперь оно за 2 сек проходит , но нужно за 1

А про Славин код я разобрался почти но не всё (не селён в С++ , то что подчеркнуто не знаю)

int ansl, ansr;
int ans = 0;

for(int i = 1; i <= n; i++)
{
int cur = 1;
int l = i - 1, r = i + 1;
while(l >= 1 && r <= n && a[l] == a[r])
{
l--;
r++;
cur += 2;

}

if(cur > ans)
{
ans = cur;
ansl = ++l;
ansr = --r;

}
}
VladKB1 вне форума Ответить с цитированием
Старый 18.06.2014, 01:24   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

i++ называется постинкрементом. Например:
Код:
i = 3;
k = i++;
Результат: k = 3, i = 4.
В данном случае переписывайте в обычный цикл for..to..do.
a[l] == a[r] - это оператор равенства (в паскале просто "=").
l--;r++;cur += 2; - расписываются похоже: l := l - 1; r := r + 1; cur := cur + 2;. Или можно воспользоваться процедурами inc и dec.
ansl = ++l; -> l := l + 1; ansl := l;, хотя в данном случае значение l уже неважно, так что можно ansl := l + 1;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.06.2014 в 01:26.
BDA вне форума Ответить с цитированием
Старый 20.06.2014, 17:34   #8
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
i++ называется постинкрементом. Например:
Код:
i = 3;
k = i++;
Результат: k = 3, i = 4.
В данном случае переписывайте в обычный цикл for..to..do.
a[l] == a[r] - это оператор равенства (в паскале просто "=").
l--;r++;cur += 2; - расписываются похоже: l := l - 1; r := r + 1; cur := cur + 2;. Или можно воспользоваться процедурами inc и dec.
ansl = ++l; -> l := l + 1; ansl := l;, хотя в данном случае значение l уже неважно, так что можно ansl := l + 1;
Этот код не работает он не проходит все тесты
VladKB1 вне форума Ответить с цитированием
Старый 20.06.2014, 17:36   #9
SlavaSSU
Пользователь
 
Регистрация: 15.04.2012
Сообщений: 46
По умолчанию

покажи весь код
НИУ СГУ им. Чернышевского
SlavaSSU вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм поиска палиндрома Mr. Boogie man Общие вопросы C/C++ 1 07.01.2012 16:36
Определение палиндрома без массивов Negent Общие вопросы C/C++ 7 09.12.2011 17:46
проверка палиндрома ArniLand Общие вопросы C/C++ 4 27.12.2010 14:46
Паскаль.Определение числа палиндрома uropb992 Помощь студентам 6 09.06.2010 04:58
Разобраться с кодом - поиск палиндрома mamant1 Помощь студентам 0 09.12.2009 20:06