乙個首位相連的字串,我們要尋找乙個位置,從這個位置向後形成乙個新字串,我們需要使這個字串字典序最小。
有乙個字串str,下標為 0 ~ len
我們這裡要i = 0,j = 1,k = 0,表示從i開始k長度和從j開始k長度的字串相同(i,j表示當前判斷的位置)
(1)當str[i + k] == str[j + k] 時 k++;
(2)當str[i] > str[j]時,我們發現i位置比j位置上字典序要大,那麼不能使用i作為開頭了,我們要將i向後移動,移動多少呢?有因為i開頭和j開頭的有k個相同的字元,那麼就執行 i = i + k +1;
(3)反之則 j = j + k + 1;
(4)最終i和j中較小的值就是我們最終開始的位置
相反如果是最大表示法的話,我們就要求解字典序最大的字串,那麼我們只需要在執行第二或第三個操作時選擇較大的那個位置較好了 題意
給出n個0/1串,通過迴圈可以相同的串算一類,求一共有幾類串。
思路用最小表示法表示字串,然後用set去重即可
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
1e4+5;
const
int m =
1e6+5;
const
int inf =
0x3f3f3f3f
;const
int mod =
1e9+7;
typedef
long
long ll;
char str[n]
;set st;
intget_min()
}return
min(i,j);}
intmain()
st.insert
(s);
} cout << st.
size()
<< endl;
}return0;
}
最大最小表示法
時間複雜度 o n 應用 比較兩個環形串是否是同一字串 判重 判同分異構等 判同分異構 都化為最小或最大 看有幾個不一樣的就好了。放到set裡。最小表示法是我在看插頭dp的時候看到的乙個名詞,就先來看了一下這個演算法,還是蠻簡單的,有乙個首位相連的字串,我們要尋找乙個位置,從這個位置向後形成乙個新字...
最小 最大 表示法
最小表示法是求與某個字串迴圈同構的所有字串中,字典序最小的串是哪個。比如說乙個字串jdrakioi,它長為8,也就是說最多有八種迴圈同構的方法。jdrakioi drakioij rakioijd akioijdr kioijdra ioijdrak oijdraki ijdrakio。這幾個串在原...
最大最小表示法
沒看懂。對。是的。這幾天有點迷。時間複雜度 o n 應用 比較兩個環形串是否是同一字串 判重 判同分異構等 判同分異構 都化為最小或最大 看有幾個不一樣的就好了。放到set裡。最小表示法是我在看插頭dp的時候看到的乙個名詞,就先來看了一下這個演算法,還是蠻簡單的,有乙個首位相連的字串,我們要尋找乙個...