中石油训练赛 - Isomorphic Inversion(哈希+贪心)
題目描述
Let s be a given string of up to 106?digits. Find the maximal k for which it is possible to partition s into k consecutive contiguous substrings, such that the k parts form a palindrome.
More precisely, we say that strings s0, s1, . . . , sk?1?form a palindrome if si?= sk?1?i?for all 0 ≤ i < k.
In the first sample case, we can split the string 652526 into 4 parts as 6|52|52|6, and these parts together form a palindrome. It turns out that it is impossible to split this input into more than 4 parts while still making sure the parts form a palindrome.
?
輸入
A nonempty string of up to 106?digits.
?
輸出
Print the maximal value of k on a single line.
?
樣例輸入
652526樣例輸出
4 題目鏈接:點擊查看題目大意:給定一個字符串,可以進行k次分割,將原字符串分割為連續的k+1個子字符串,使得這k+1個子字符串組成回文串
題目分析:看到這個題的第一想法就是貪心,因為關于回文串的定義是左右相等,那么長度也必然相等,所以k分割的位置左右都是對稱的,一開始我們可以從左右兩個端點出發,每次向中間點靠攏一個單位,每次靠攏之后求一下所覆蓋范圍內的字串,左邊是否等于右邊,如果相等就讓結果加二,如果不相等就讓繼續向里靠攏,直到達到中點為止。這樣貪心理論上是沒錯的,當然實際也是沒錯的,只是我不會證明。。不過理解起來應該是一下就能明白的啦
不過這樣實現,乍一看是n的復雜度,但是有個致命的缺陷,就是在比較字串的時候,如果是正常的暴力比較,那時間復雜度最差會上升到n*n,直接就爆掉了,如果用stl的srting的substr函數,雖然能得到少許優化,但stl的時間復雜度還是不敢恭維的,那么有沒有辦法可以將時間復雜度控制在n呢?做這個題的時候我突發奇想,能不能打個哈希表,之前偷偷學來的知識,沒想到這次真的用上了,先用n的時間打一個哈希表,然后后續每次查詢,時間復雜度都下降到了1,這樣一來,實現整個題目的時間復雜度就變成了2*n,完美解決。
不過補充一點,這個題目當時做的時候,真正卡住我們的不是哈希表的TLE,而是解決中點問題時的WA,我們想不過來中點時候的幾種特殊情況該如何處理,就是當字符串為奇數或偶數時,或者當字符串中間為回文串或不是回文串時,我們調了好久好久,自己造了五六個完全不同樣例,終于在最后WA了兩三發后給A掉了這個題,直接放當時寫的源代碼吧,關于中點那里我們是胡搞的,相當于把所有情況列舉出來然后符合條件的才進行下一步,現在我還是不太懂。。太菜了太菜了。。
#include<iostream> #include<algorithm> using namespace std;typedef unsigned long long ull;const int N=1e6+100;ull Hash[N],p[N];int n;string str;void _hash()//打個哈希表 {Hash[0]=0;for(int i=1;i<=n;i++){Hash[i]=Hash[i-1]*131+str[i]-'0'+1;}p[0]=1;for(int i=1;i<=n;i++)p[i]=p[i-1]*131; }int main() {cin>>str;n=str.size();str=" "+str;_hash();int l=1,r=n;int start=1,end=n;int ans=0;while(l<r){ull a=Hash[l]-Hash[start-1]*p[l-start+1];ull b=Hash[end]-Hash[r-1]*p[end-r+1];if(a==b){ans+=2;start=l+1;end=r-1; }l++;r--; }if(l==r)//不明原理的胡搞ans++;if(start < end&&l>r) ans++;//同上-..-cout<<ans<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的中石油训练赛 - Isomorphic Inversion(哈希+贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中石油训练赛 - Edit Distan
- 下一篇: 中石油训练赛 - Bee Problem