Нахождение наибольшей общей подстроки

Эта задача была задана одном из тестовых заданий для Tolstoy Summer Camp.

Напишите, пожалуйста, программу для решения описанной ниже задачи. Используйте любой объектно-ориентированный язык. Программа должна представлять собой один файл. Оцениваться будет не только её работоспособность, но и читабельность кода, эффективность и скорость работы алгоритма.

Наибольшая общая подстрока

Даны K строк, нужно найти их наибольшую общую подстроку.

Формат входных данных

В первой строке записано целое число K (1 ≤ K ≤ 10). Далее приведены исходные K строк. Каждая строка состоит не более чем из 10 000 строчных латинских букв.

Формат выходных данных

Выведите наибольшую общую подстроку.

Примеры:
Входные данные
3
abacaba
mycabarchive
acabistrue
Выходные данные
cab

Решение на PHP

$input = "3
abacabchgfsjsdfssdasdaasdabaistrs
mycabarcistrhive
acabistrue";
 
 
// parse input
$array = array_unique( explode("\n", $input) );
$array = array_diff($array, array(""));
unset($array[0]);
 
// get min str
$min_str = min($array);
unset($array[ array_search($min_str, $array) ]);
 
$search_str = $min_str;
$substr = null;
$start_pos = 0;
$min_str_len = strlen($min_str);
 
while ($start_pos++ != $min_str_len) {
 
	while ( strlen($search_str) > strlen($substr) ) {
		// find substr in array
		$sub_str_found = 0;
 
		foreach ($array as $row) {
			if (strpos($row, $search_str) !== false) {
				$sub_str_found = 1;
			} else {
				$sub_str_found = 0;
				break;
			}
		}
 
		if ($sub_str_found == 1) {
			$substr = $search_str;
			break;
		} else {
			$search_str = substr($search_str, 0, -1);
		}
	}
 
	$search_str = substr($min_str, $start_pos);
}
 
echo $substr;

uInfo v1.4

Новая версия скрипта получения информации о зашедшем пользователе.

  • Поддержка версии OS X
  • Поддержка Opera Next

Живой пример работы: http://ip.ziggi.org/
GitHub: https://github.com/ziggi/uInfo

uInfo v1.3

Новая версия скрипта получения информации о зашедшем пользователе.

  • Обновлён алгоритм получения версии браузера.
  • Поддержка Яндекс.Браузер
  • Поддержка версий для iOS
  • Поддержка Ubuntu

Живой пример работы: http://ip.ziggi.org/
GitHub: https://github.com/ziggi/uInfo

Создание приложения-ссылки в Google Chrome

В этой статье вы узнаете как создавать приложения-ссылки в Google Chrome. Зачем это? Это довольно удобно, ибо стандартной экспресс-панели Google Chrome не хватает множества настроек. Для некоторых сайтов уже существуют такие приложения-ссылки, но далеко не для всех.

Также бывает, что некоторые приложения ссылаются не туда, куда хотелось-бы, например главная страница YouTube — это страница с рекомендациями, но мне гораздо удобнее переходить сразу на свои подписки, поэтому я использую своё приложение, а не приложение от Google.

В итоге, вы можете получить что-то подобное:
chrome apps
Читать дальше

Автоматоны Pawn

В языке Pawn есть механизм состояний(автоматон) — это такая система, которая позволяет определить несколько копий одной функции для использования в различных условиях. Я начну объяснять с примера, ибо так получится более наглядно, а ниже подробно опишу эту систему.

Пример

Допустим нам нужно сохранить данные игрока и данные гонок, а также сообщить об этом игрокам и гонщикам соответственно. При обычной реализации код выглядит грязновато:

#include <a_samp>
 
forward data_Save(type);
forward message_Save(type);
 
enum {
	players,
	races
}
 
main() {
	data_Save(players);
	message_Save(players);
}
 
public data_Save(type)
{
	switch (type) {
		case players: {
			// saving
		}
		case races: {
			// saving
		}
	}
}
public message_Save(type)
{
	switch (type) {
		case players: {
			// send message to player
		}
		case races: {
			// send message to racers
		}
	}
}

А реализация с помощью автоматонов выглядит очень элегантно:

#include <a_samp>
 
forward data_Save();
 
main() {
	state dataType:players;
	data_Save();
	message_Save();
}
 
public data_Save() <dataType:players>
{
	// saving
}
 
public data_Save() <dataType:races>
{
	// saving
}
 
public message_Save() <dataType:players>
{
	// send message to players
}
 
public message_Save() <dataType:races>
{
	// send message to racers
}

Читать дальше