E111. Solução задачи "сжатие строки" за O (N)

e-maxx algorithm original: C/C++ #algorithm #emaxx #string
O texto da tarefa é traduzido do russo para o idioma selecionado. O código permanece sem alterações.

Источник: e-maxx.ru/algo, страница PDF 349.

Дана string S. it is required find такую строку T, что string S получается многократным повторением T. Из всех возможных T нужно выбрать наименьшую по длине.

Эту задачу очень просто решить за O (N) с помощью префикс-функции. Итак, пусть array P - префикс-функция строки S, которую можно вычислить за O (N). Теперь рассмотрим значение последнего elementа P: P[N-1]. Если N делится на (N - P[N-1]), то ответ существует, и это N - P[N-1] первых букв строки S. Если же не делится, то ответа не существует. Корректность этого метода легко понять. P[N-1] равно длине наидлиннейшего собственного суффикса строки S, совпадающего с префиксом S. Если ответ существует, то, очевидно, начальный кусок строки S длиной (N - P[N-1]) и будет ответом, и, следовательно, N будет делиться на (N - P[N-1]). Если же ответа не существует, то (N - P[N-1]) будет равно какому-то непонятному значению, на которое N делиться не будет (иначе бы ответ существовал).

Implementação

int n = (int) s.length();

vector<int> p (n);

// ... здесь вычисление префикс-функции ...

int l = n - p[n-1];
if (n % l == 0)

cout << s.substr (l);

else

cout << "No Solution";

C# solução

rascunho automático, revisar antes de enviar
using System;
using System.Collections.Generic;
using System.Linq;

public static class AlgorithmDraft
{
    // Auto-generated C# draft from the original e-maxx C/C++ listing. Review before production use.
    int n = (int) s.length();
    List<int> p (n);
    // ... здесь вычисление префикс-функции ...
    int l = n - p[n-1];
    if (n % l == 0)
            Console.WriteLine( s.substr (l);
    else
            Console.WriteLine( "No Solution";
}

C++ solução

correspondente/original
int n = (int) s.length();
vector<int> p (n);
// ... здесь вычисление префикс-функции ...
int l = n - p[n-1];
if (n % l == 0)
        cout << s.substr (l);
else
        cout << "No Solution";

Java solução

rascunho automático, revisar antes de enviar
import java.util.*;
import java.math.*;

public class AlgorithmDraft {
    // Auto-generated Java draft from the original e-maxx C/C++ listing. Review before production use.
    int n = (int) s.length();
    ArrayList<Integer> p (n);
    // ... здесь вычисление префикс-функции ...
    int l = n - p[n-1];
    if (n % l == 0)
            System.out.println( s.substr (l);
    else
            System.out.println( "No Solution";
}

Материал разбит как Algoritmoическая Tarefa: изучить постановку, понять асимптотику и реализовать Algoritmo на выбранном языке.

Vacancies for this task

vagas ativas with overlapping task tags are mostradas.

Todas as vagas
Ainda não há vagas ativas.