最小表示法
最小表示法是判断同构的一种方法,和HASH一样都有字符串和树的两种
字符串
字符串最小表示法定义
给定一个字符串,把它首尾相连形成字符环,然后从某个点开始的字符串字典序最小,为该字符串的最小表示
过程
用两个指针i,j,且k=0,然后若x[i+k]=x[j+k]则k++,直到不等
若x[i+k]>x[j+k]
那么i+=k+1(x[i+k]>x[j+k]说明i开头的字典序比j开头的字典序大)
否则j+=k+1
树
对于一棵树,其中一个点的子树的最小表示为把它的子节点按照字典序最小连接起来
BZOJ2882 工艺
字符串最小表示法模板题
const
maxn=300010;
var
x,ans:array[0..maxn]of longint;
i,j,k:longint;
n:longint;
begin
readln(n);
for i:=1 to n do
read(x[i]);
i:=1; j:=2; x[n+1]:=maxlongint;
while (i<=n)and(j<=n) do
begin
k:=0;
while x[(i+k)mod n]=x[(j+k)mod n] do
inc(k);
if x[(i+k)mod n]<x[(j+k)mod n]
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 ans[k]:=x[j]; inc(k); end;
for j:=1 to i-1 do
begin ans[k]:=x[j]; inc(k); end;
for i:=1 to n-1 do
write(ans[i],' ');
writeln(ans[n]);
end.