來自
最小表示法是我在看插頭dp的時候看到的乙個名詞,就先來看了一下這個演算法,還是蠻簡單的,有乙個首位相連的字串,我們要尋找乙個位置,從這個位置向後形成乙個新字串,我們需要使這個字串字典序最小。
我們這裡要i = 0,j = 1,k = 0,表示從i開始k長度和從j開始k長度的字串相同(i,j表示當前判斷的位置)
當我們str[i] == str[j]時,根據上面k的定義,我們的需要進行k+1操作
當str[i] > str[j]時,我們發現i位置比j位置上字典序要大,那麼不能使用i作為開頭了,我們要將i向後移動,移動多少呢?有因為i開頭和j開頭的有k個相同的字元,那麼就執行 i = i + k +1
相反str[i] < str[j]時,執行:j = j + k +1
最終i和j中較小的值就是我們最終開始的位置
相反如果是最大表示法的話,我們就要求解字典序最大的字串,那麼我們只需要在執行第二或第三個操作時選擇較大的那個位置較好了
int
get_min()
}return i >j ?j :i;
}
有乙個最小表示的裸題,poj 1509
#include
#include
#include
#include
#include
using
namespace std;
char s[
11000];
intget_min()
}return i >j ?j :i;
}int
main()
}
最小表示法是我在看插頭dp的時候看到的乙個名詞,就先來看了一下這個演算法,還是蠻簡單的,有乙個首位相連的字串,我們要尋找乙個位置,從這個位置向後形成乙個新字串,我們需要使這個字串字典序最小。
我們這裡要i = 0,j = 1,k = 0,表示從i開始k長度和從j開始k長度的字串相同(i,j表示當前判斷的位置)
當我們str[i] == str[j]時,根據上面k的定義,我們的需要進行k+1操作
當str[i] > str[j]時,我們發現i位置比j位置上字典序要大,那麼不能使用i作為開頭了,我們要將i向後移動,移動多少呢?有因為i開頭和j開頭的有k個相同的字元,那麼就執行 i = i + k +1
相反str[i] < str[j]時,執行:j = j + k +1
最終i和j中較小的值就是我們最終開始的位置
相反如果是最大表示法的話,我們就要求解字典序最大的字串,那麼我們只需要在執行第二或第三個操作時選擇較大的那個位置較好了
最小表示法
最小表示法就是找出字串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表示...