天天看點

擴充KMP --- HDU 3613 Best Reward Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613

Mean: 

給你一個字元串,每個字元都有一個權值(可能為負),你需要将這個字元串分成兩個子串,使得這兩個子串的價值之和最大。一個子串價值的計算方法:如果這個子串是回文串,那麼價值就是這個子串所有字元權值之和;否則價值為0。

analyse:

擴充KMP算法運用。

總體思路:

找出所有包含第一個字母的回文串和包含最後一個字母的回文串,然後O(n)掃一遍,每次判斷第i個字母之前(包含第i個字母)的子串是否是回文,以及從第i個字母後的子串是否是回文,然後計算出答案,取最大值。

具體做法:

假設輸入的字元串是"abcda"

構造串s1="abcda#adcba"

求s1的Next數組,得到了包含第一個字母的回文串的位置;

構造串s2="adcba#abcda"

求s2的Next數組,得到了包含最後一個字母的回文串的位置;

用兩個flag數組标記這些位置,然後掃一遍就得答案了。

中間加一個'#'并後接反串的目的是:當整個串都是回文的時候能夠被Next數組記錄下。

Time complexity: O(nlogn)

Source code: 

 第一遍寫,不夠優化:

擴充KMP --- HDU 3613 Best Reward Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613
擴充KMP --- HDU 3613 Best Reward Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613

View Code

優化後的代碼:

擴充KMP --- HDU 3613 Best Reward Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613
擴充KMP --- HDU 3613 Best Reward Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613

繼續閱讀