最小表示法:用於解決字串s的迴圈同構串中字典序最小的那個,稱為s的最小表示。
eg. s=「abcd」,則其迴圈同構串為:「abcd」,「dabc」,「cdab」,「bcda」,最小的為"abcd"
演算法思路:因為迴圈同構問題,所以可以先複製乙份s到s後邊,形成ss。之後雙指標i,j向後掃瞄,i,j所指代表以i,j為開始的迴圈同構串,如果i+k與j+k不匹配了,且不妨令s[i+k]>s[j+k],則會有i+1,…i+k代表的都不是最小表示,所以i直接變成i+k+1。
《演算法競賽高階指南》上的板子:
#include using namespace std;
const int maxn=1e5+10;
char s[maxn<<1];
int n;
int solve()
else
} int ans=min(i,j);
return ans;
}int main()
else
} int ans=min(l,r);
return ans;
}int main()
else
} int ans=min(i,j);
return ans;
}int main()
學習筆記 最小表示法
給定乙個長度為n,可旋轉的字串環,求從哪個位置斷開的長度為n的字串字典序最小 大 以最小為例,最大同理 bzoj1398 vijos1382尋找主人 necklace 當求出最小表示法之後,掃一遍即可比較兩個不可翻轉的環是否本質相同,比較本質應該是其常見用途吧 1 include2 include3...
學習筆記 最小表示法
一 最小表示法解決的問題 找到乙個字串的迴圈同構串中字典序最小的那個串。二 字串的迴圈同構 比如長度為5字串 abcde 它的5個迴圈同構串有 abcde,bcdea,cdeab,deabc,eabcd 其中字典序最小的串為 abcde 三 求 abcde 的字典序最小的迴圈同構串 1.把 abcd...
筆記 最小表示法
引言 用於判斷兩個字串不計順序是否相等的問題。引例 a abcd b cdba 分析 若乙個乙個的列舉的話,時間複雜度高達 由這個簡單的題得出來的簡單思想 如果兩列數是相同的,那麼他們排完序過後的數列也一定是相同的 專有名詞 迴圈同構 字串s abcd 那麼它的迴圈同構就有 bcda cdab da...