最小表示法是判斷同構的一種方法,和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
對於一棵樹,其中乙個點的子樹的最小表示為把它的子節點按照字典序最小連線起來
字串最小表示法模板題
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]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
dobegin ans[k]:=x[j]; inc(k); end;
for i:=1
to n-1
dowrite(ans[i],' ');
writeln(ans[n]);
end.
最小表示法
最小表示法就是找出字串s的的迴圈同構串中字典序最小的乙個。那麼什麼是迴圈同構串呢。是 設s bcad 且s 是s 的迴圈同構的串。s 可以是 bcad 或者cadb,adbc,dbca 即在字串s中從i 0開始,從i迴圈到字串末尾,再從頭迴圈到i,所形成的字元就是s迴圈同構串。因為這樣的同構串不止乙...
最小表示法
最小表示法 思想 在字串迴圈同構問題中的應用 摘自周源的ppt 前言 最小表示法 比起動態規劃 貪心等思想,在當今競賽中似乎並不是很常見。但是在解決判斷 同構 一類問題中卻起著重要的作用。本文即將討論字串中的同構問題,如何巧妙地運用最小表示法來解題呢,讓我們繼續一起思考吧。到底什麼是迴圈同構的字串呢...
最小表示法
最小表示法與kmp演算法一樣都可以解決字串匹配問題,但效率更高,短,作用更大。最小表示法就是乙個字串的最小字典序。怎麼求乙個字串的最小字典序呢?首先將這個字串擴充套件一倍 建設存在d陣列裡 然後我們用三個指標i 0,j 1,k 0,來尋找最小字典序的開頭字母,為了優於kmp,我們要做到o n i表示...