���������: 7 Sep 2008 14:40 �������������: 24 Aug 2011 18:36 ������������ �������. �������� ������. ���������� ����������� ������������ ������������� ������������ ���������������� ������� ������������ ������� (Lyndon decomposition). ������ ���������� �������, ���� ��� ������ ������ ������ ������ ������������ ��������. ������� ������� �����: , , , , , , . ����� ��������, ��� ������ �������� ������� ����� � ������ �����, ����� ��� ������ ������ ���� ����� ������������� ����������� �������. �����, ����� ���� ������ . ����� ������������� ������� ������ ���������� � ���������� , ��� ������ ������, � ��� ���� . ����� ��������, ��� ��� ����� ������ ��� ���������� ���������� � �����������. �������� �������������� ������ (Duval's algorithm) ������� ��� ������ ������ ����� ������������ ������� �� ����� � �������������� �������������� ������. �������� �� �������� ����� � 0-����������. ����� ��������������� ������� ����������� ������. ������ ���������� �����������, ���� ��� ����� ��� , ��� — ��������� ������� ������, � — ��������� ������� ������ . �������� ������ �������� ������. � ����� ������ ��� ������ ������ S ���������� ��������� �� ��� ������ , ��� � ������ ������������ ������� ��� ������� � ��� ������ �� ������������ ����������; ������ — ��� ����������� ������ (������ ����� ������� ����� ������ �� �� ����� ����������); ������ — ��� ��� �� ������������ ����� ������ . ������ ��� �������� ������ ���� ������ ������ ������ � �������� �������� ��� � ������ . ��� ����, ��������, ��� ������-�� �������� ������ ������������ ������� ���������� ���������, � ��� ����� ��������� � ������ . ������ ������ �������� ���������. ��-������, ����� �������������� ��������� �� ������ ������ . ������� ���� ��������� ����� �����������, ���� , �.�. ���� ��� ������ �� ������� � ������ . ������ ����� ����� ��������� ��� ���������: ��������� �� ������ ������ (���������� ��������� �� ��������� ������-��������) � ��������� �� ������� ������ � ������ , � ������� ����� ������������� ���������. ����� ����� � ����� �������� �������� ������ � ������ , ��� ���� ���������� ���������� ��������� � �������� . ����� � ��� ��������� ��� ��������� ������: - ����
, �� �� ����� �������� ������ � ������ , �� ������� � "������������". �������������, � ���� ������ �� ������ ����������� ��������� � �� �������. - ����
, ��, ��������, ������ ������ �������. ����� �� ����������� �� �������, � ����������� ������� �� , ����� ��������� ������ ����������� � ������ �������� . - ����
, �� ������ ��� �� ����� ���� �����������. ������� �� ��������� ����������� ������ �� ������� ������ ���� "�������" (������� ������� ������, ��������, ������); ������� ������ ��������� � ����� (�.�. ������� �� �������, ������� ���������� ��������� ), � "�������" ������ � �������� ��������� ������� � ������ , � ������������� ���������� ����������� �����. ��� ����� �� �� ��������� �������� �������� ����� ������ ���������� �������, ����, ��� �� �� ��� ���������� ����������� ������ � ����������� �������� ��������. �������� ������ ��������, ��� ��� ������ ������� ������� ����� ��� ����� ����� �� �����; �� ���, ��������, ����� .
����������������� ���������� ��������� ������, ������� ����� �������� ������� ������������ ������� ������ : string s; // ������� ������
int n = (int) s.length();
int i=0;
while (i < n) {
int j=i+1, k=i;
while (j < n && s[k] <= s[j]) {
if (s[k] < s[j])
k = i;
else
++k;
++j;
}
while (i <= k) {
cout << s.substr (i, j-k) << ' ';
i += j - k;
}
}���������������� �������, ��� ��� ��������� ������ ��������� ������, � ������ ��� ��������� , , . ������ ������ ����� ������ ���������. ������� ���� while ������ �� ����� ��������, ��������� � ����� ������ ��� �������� ��������� ��� ������� ���� ������ (� ����� �������� ���������, ��������, ����� ). ������ ������ ���������� �������� ������� ���������� ����� while. ��� ����� ���������� ������ ��������� ���� while — �� ��� ������ ���� ������� ������� ��������� ���������� ����� ����� � ��� �� ������� ������ ��������� ����� . �������, ��� ������ �������� �����������, ������ � ������� ������ ����� ����� ��� ��� , �.�. � ����� �� ����������� . ��������� ����� ������ ����� , � ��������� ������������� �� ������� �� ������ �������� ������� ���������� ����� while, �� ���� ���� �������� �� ����� ��������. ������ ������� �������� ������ , � �� ��������, ��� ������ ��������� ���� while ������ ��� ��������� �� ����� ��������. ���������, ��� ����� ��������� ��������, ��������, ��� ��� ������ �������� ��������� �� ����� �������� ������� ���������� while-�. �������������, �������� ������ ����������� �� . ����� ������� � ����� ��������� ��������, ����������� ���������� ������. ��������� ������ �������� ������� ���������� ����� while ���������� ��� ��������� ��������, � ����� ���� ��������� ������������ ����� ��������� �������� ����� (����� ������, ��� ���� ������ ������������), �� ����� ����� ��������� �������� �� ����������� . ���������� ����������� ������������ ����������� ���� ������ . �������� ��� ������ ������������ ������� (�� ����� ��� ������� �� ������� � ������ (���� �� ��������� ������������ � ����� ����)). ����� ����������� ����, ������� ���������� � �������, ������� (�.�. � ������ ���������� ������ ), � ������������� � �������, ������� ��� ������ n (�.�. �� ������ ����������). ������������, ��� ������� ������ ����� ����� � ����� ������� �������� ������������ ������ (� ���� ����� ���������, ���������������� ������������ ������������ �������). ������ ������������ ����� ����� ������ — ���������� ��������, ��� ��������� � ������ ������ �������� �������� ����� while ��������� �� ������ �������� ������������ �����. ����� �� �������� ����� ���������� (��� ��������� ���� ��� ���������� ������, ����� ������� ��������� ������ � ����): string min_cyclic_shift (string s) {
s += s;
int n = (int) s.length();
int i=0, ans=0;
while (i < n/2) {
ans = i;
int j=i+1, k=i;
while (j < n && s[k] <= s[j]) {
if (s[k] < s[j])
k = i;
else
++k;
++j;
}
while (i <= k) i += j - k;
}
return s.substr (ans, n/2);
} ������ � online judges ������ �����, ������� ����� ������, ��������� �������� ������:
|