日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中石油训练赛 - Isomorphic Inversion(哈希+贪心)

發布時間:2024/4/11 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中石油训练赛 - 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(哈希+贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。