最小表示法彙總

2021-10-04 14:52:16 字數 1509 閱讀 5278

解法一:直接暴力利用string的compare和substr

(這樣竟然也能過,哭了)

#include

#include

#include

using

namespace std;

intmain()

}printf

("%d\n"

,minpos+1)

;}return0;

}

解法二:最小表示法

用於求乙個字串首尾相連時的最小字典序

模版:

i=

0,j=1;

while

(i<=n&&j<=n)

else

} i=

min(i,j)

;

意思就是從i=0、j=1開始,k=0

①如果s[i+k]s[j+k],則k++;

②如果s[i+k]>s[j+k],則i=i+k+1;若ij,則i++;

③如果s[i+k]s[j+k],此時要讓i=i+k+1。那我們直接證明在i到i+k之間不存在最小字典序的字串就好,取中間一點為i+p,因為s[i+k]>s[j+k],s[i+p]到s[i+k-1]與s[j+p]到s[j+k-1]相同,那麼i+p到i+k字典序一定是大於j+p到j+k的,所以可以直接讓i跳到i+k+1處。

③的證明也同理。

#include

#include

#include

using

namespace std;

intmain()

else

} cout<<

min(i,j)+1

<}return0;

}

2.hdu4162

難在題意理解,就是為了便於記錄乙個圖形的旋轉等操作,將字串表示成差分形式,及s[i]=(s[i+1]-s[i]+8)%8,然後利用最小表示法找最小字典序即可

#include

#include

#include

using

namespace std;

string s;

int change[

610000];

int len;

intminimumrepresentation()

else

}return

min(i,j);}

intmain()

change[

2*len-1]

=change[len-1]

;int pos=

minimumrepresentation()

;for

(int i=

0;i)printf

("%d"

,change[i+pos]);

printf

("\n");

}return0;

}

最小表示法

最小表示法就是找出字串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表示...