传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1398
题目大意
求最小表示法
题解
const
maxn=1000010;
var
x,ans1,ans2:array[0..maxn]of longint;
i,j,k:longint;
n:longint;
cha:char;
begin
i:=0;
while not eoln do
begin inc(i); read(cha); x[i]:=ord(cha)-48; end;
n:=i; readln;
i:=1; j:=2; x[n+1]:=maxlongint;
while (i<=n)and(j<=n) do
begin
k:=0;
while x[i+k]=x[j+k] do
inc(k);
if x[i+k]<x[j+k]
then inc(j,k+1)
else inc(i,k+1);
if i=j then inc(j);
end;
k:=1;
for j:=i to n do
begin ans1[k]:=x[j]; inc(k); end;
for j:=1 to i-1 do
begin ans1[k]:=x[j]; inc(k); end;
i:=0;
while not eoln do
begin inc(i); read(cha); x[i]:=ord(cha)-48; end;
n:=i; readln;
i:=1; j:=2; x[n+1]:=maxlongint;
while (i<=n)and(j<=n) do
begin
k:=0;
while x[i+k]=x[j+k] do
inc(k);
if x[i+k]<x[j+k]
then inc(j,k+1)
else inc(i,k+1);
if i=j then inc(j);
end;
k:=1;
for j:=i to n do
begin ans2[k]:=x[j]; inc(k); end;
for j:=1 to i-1 do
begin ans2[k]:=x[j]; inc(k); end;
k:=1;
for i:=1 to n do
if ans1[i]<>ans2[i] then begin k:=0; break; end;
if k=0 then begin writeln('No'); halt; end;
writeln('Yes');
for i:=1 to n-1 do
write(ans1[i]);
writeln(ans1[n]);
end.