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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2009, 16:08   #1
Witaliy
Форумчанин Подтвердите свой е-майл
 
Регистрация: 27.04.2008
Сообщений: 179
По умолчанию Задача (динамика)

Здравствуйте.
У меня такая задача: нужно найти среди N слов количество разных(одинаковые они тогда, когда перестановкой литер одного слова можна получить другое и их длинны одинаковы)
n<=20000
Нпрример
N=5;
список слов:
slovo
hello
olovo
ehlol
yes

Вот мой код:
Код:
program my;
var n,i,j,res : longint;
    a : array[1..20000] of string[20];
function can_word(s1,s2 : string) : boolean;
var i,j,k : integer;
begin
k := 0;
 for i := 1 to length(s1) do
  begin
  for j := 1 to length(s2) do
   begin
   if (s1[i]=s2[j]) and(s2[j]<>'-') then begin
   s2[j] := '-';
   s1[i] := '-';
   inc(k);
   break;
   end;
   end;
  end;
 if (k >= length(s1)) and (length(s1) = length(s2)) then
  can_word := true
 else
  can_word := false;
end;
begin
readln(n);
res := n;
for i := 1 to n do
begin
readln(a[i]);
if i > 1 then
 begin
 for j := 1 to i-1 do
  begin
  if can_word(a[i],a[j]) then
   begin
   a[j] := '-';
   dec(res);
   end;
  end;
 end;
 end;
if n = 1 then
 writeln(1)
else
writeln(res);
end.
Но такой подход очень медленный и неефективен. Помогите как-то оптимизировать его.
Спасибо.
www.programmer.uaforums.net - Український форум програмістів.

www.satellite.ipsys.net - Український форум супутникового телебачення.
Witaliy вне форума Ответить с цитированием
Старый 06.03.2009, 16:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Делал подобное в колледже, там слова превращал в хеши, тогда получалась строка которая независимот от пререстановки букв не менялась, потом тупо сравнивал хеши, вот только формулу уже не помню...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.03.2009, 17:47   #3
Minotavr_x86
Пользователь
 
Аватар для Minotavr_x86
 
Регистрация: 22.03.2007
Сообщений: 24
По умолчанию

Есть дава предложения:
1. Упорядочить во всех словах буквы, а потом сравнить.
2. Сложить все буквы в слове и сравнивать числа.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Делал подобное в колледже, там слова превращал в хеши, тогда получалась строка которая независимот от пререстановки букв не менялась, потом тупо сравнивал хеши, вот только формулу уже не помню...
В общем случае однозначного соответствия между исходными данными и хеш-кодом нет. Поэтому существует множество массивов данных, дающих одинаковые хеш-коды. wikipeda.org
Не всё получается так, как придумал,
Но разве за это должно быть стыдно!?!

Последний раз редактировалось Minotavr_x86; 06.03.2009 в 18:00.
Minotavr_x86 вне форума Ответить с цитированием
Старый 06.03.2009, 19:03   #4
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
По умолчанию

Если дать ограничение на понятие «слова», как последовательность 'a'..'z', то любое слово однозначно задает 26-элементную последовательность целых чисел, при этом "равные" слова дают одинаковую последовательность, а "разные" — разную (например, если в первое число дает количество букв "А", второе — "В" и т.д.)
Тогда еще при чтение можно сформировать (преобразовать) такие последовательности (по сути, массивы) для каждого слова и под конец устроить сравнения полученых последовательностей, которое будет в любом случая намного быстрее, чем попарный запуск function can_word(s1,s2 : string) : boolean;
Silence is of great value...
Jean-Esther вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ВКЛЮЧАЯ НАУШНИКИ, ЗВУК ИСХОДИТ И ИЗ ДИНАМИКА ТОЖЕ.ХОТЯ ДОЛЖЕН ОТКЛЮЧАТЬСЯ S82 Помощь студентам 7 06.02.2009 21:35