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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2015, 16:56   #1
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
Лампочка Задача про палиндром...

Хочу предложить вам вот такую задачку:
Дана строка, в которую входят только строчные латинские буквы (то бишь слово маленькими буквами). Нужно определить, какое наименьшее число букв нужно дописать в конец слова, чтобы оно стало палиндромом. Вот.
isst вне форума Ответить с цитированием
Старый 25.01.2015, 16:58   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Я бы бахнул бинарный поиск по длине самого палиндрома.. Получил бы O(nlogn)
Poma][a вне форума Ответить с цитированием
Старый 25.01.2015, 17:13   #3
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
Хорошо

О-о, Рома, привет! Хорошо, учту твое предложение. Просто хотел посмотреть, кто как предложит решить, лично мой код таков, как вам?

Код:
function IsPalindrome(s:StRing):bOOlean;
 
var i, len:IntegeR;
    flag:bOOlean;
   
begin
  len:= Length(s);
  flag:= True;
  for i:= 1 to len div 2 do
  begin
    if (s[i] <> s[len - i + 1]) then
    begin
      flag:= False;
      break;
    end;
  end;
  IsPalindrome:= flag;
end;

var s, buf:String;
    l, k:LongInt;
    
begin
  readln(s);
  if IsPalindrome(s) then writeln(0)
  else
  begin
    for l:= 1 to Length(s) do
    begin
      buf:= s;
      for k:= l downto 1 do buf:= buf + buf[k];
      if IsPalindrome(buf) then break;
    end;
    writeln(l);
  end;
end.
Принимаются замечания и предложения.
isst вне форума Ответить с цитированием
Старый 25.01.2015, 17:16   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

В худшем случае ты получишь квадрат.. вот..
А еще не используй l, если бы не подсветка я бы с ума сошел
Poma][a вне форума Ответить с цитированием
Старый 25.01.2015, 17:22   #5
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
Радость

Цитата:
Сообщение от Poma][a Посмотреть сообщение
В худшем случае ты получишь квадрат.. вот..
А еще не используй l, если бы не подсветка я бы с ума сошел
Какой квадрат? Ты о чем?

А насчет 'l' - это моя заветная буква...
isst вне форума Ответить с цитированием
Старый 25.01.2015, 17:26   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Сложность квадратичная
Poma][a вне форума Ответить с цитированием
Старый 25.01.2015, 18:17   #7
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
Радость

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Сложность квадратичная
А-а, понял.
isst вне форума Ответить с цитированием
Старый 25.01.2015, 23:21   #8
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Я недавно на другом форуме решал именно такую задачу (там ТС ничего не захотел делать сам и я своё решение не выкладывал).
Сначала я решил почти также как isst
Код:
{
Даны натуральное число N и символы S[1],...,S[n].
Преобразовать последовательность S[1],...,S[n], добавив к ней наименьшее
число символов S[n+1],...,S[m] так, чтобы последовательность S[1],...,S[m]
стала палиндромом: S[1]=S[m],S[2]=S[m-1] и т.д.
http://forum.pascalnet.ru/index.php?showtopic=30171&hl=
}

program algo002;

var
  sx:   string;
  n:    integer;
  s:    string;
  i, j: integer;
  IsPalindrom: boolean;
begin
  sx := '1234566';

  s := sx;
  n := length(s);
  IsPalindrom := False;
  i := 1;
  while i < n do
  begin
    if s[n] = s[i] then
    begin
      IsPalindrom := True;
      j := i;
      while j < n + i - j do
      begin
        if s[j] <> s[n + i - j] then
        begin
          IsPalindrom := False;
          break;
        end;
        Inc(j);
      end;
    end;
    if IsPalindrom then
      break;
    Inc(i);
  end;
  for j := i - 1 downto 1 do
    s := s + s[j];
  writeln(s);
end.
Но чуть попозже на другом форуме увидел ссылку на алгоритм (не на решение). Это алгоритм Манакера. Я воспользовался описанием алгоритма на e-maxx.ru. Но, как стало ясно из коменариев на этой странице, в реализациях кода закралась ошибка (приведены примеры). Также приведены исправления.
Перевёл код с С на Pascal и на примере с тимуса (задача 1297 с другим условием, но тоже с палиндромами) увидел ускорение работы (я не олимпиец и рейтинг пофиг):
naive 0,468-0,484 с при 374 КБ
manacher 0,015 с при 102 КБ
Сразу скажу - код получается больше. Но это как "золотое правило физики" - меньше силы, но путь длинней и наоборот.
Так, что рекомендую познакомится с алгоритмом Манакера.
----------------
PS Sorry за поток сознания. Надеюсь, что хоть чуть-чуть виден посыл - МАНАКЕР.
FPaul вне форума Ответить с цитированием
Старый 26.01.2015, 06:07   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Интересная задача, спасибо.
rrrFer вне форума Ответить с цитированием
Старый 26.01.2015, 08:21   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Эм.. Дык это же не та задача, не?

P.S. Но все равно спасибо! У меня на acmp давно валялась задачка несделанная.. а там именно Вашим Манакером и решается
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача про окружности makskovalko Помощь студентам 2 01.12.2013 23:49
Задача на палиндром Me gusta Паскаль, Turbo Pascal, PascalABC.NET 2 27.03.2013 19:17
задача про улитку leo-leo C++ Builder 6 08.07.2012 17:35
Задача про матрицы Dzenin Паскаль, Turbo Pascal, PascalABC.NET 1 24.02.2011 16:55
проверьте программу про палиндром Nice rabbit Помощь студентам 8 09.03.2010 16:35