timelimit:4000ms memorylimit:128mb
64-bit integer io format:%lld
special judge
problem description
最後來個字串簽個到吧,這題其實並不難,所需的演算法比較基礎,甚至你們最近還上過課。
為了降低難度,免得所有人爆零。這裡給幾個提示的關鍵字 :字串,回文,二分,雜湊. 注意要對奇偶回文分開二分
這樣還不會做,說明基礎有所欠缺。
給你乙個字串a和乙個字串b,請你求乙個滿足以下要求的所有字串中,最長的字串c的長度:
c必須同時是a和b的子串,即a和b中都必須存在乙個子區間和c長得一樣
c必須是乙個回文,即正過來讀和反過來讀都一樣
input
多組資料,請處理到eof
每組資料報含,兩行,每行都是僅由小寫字元構成的字串,代表a和b。
對於30%的資料。
保證|a|,|b|<=1000,且單個檔案的字元總數小於10000
對於100%的資料
保證|a|,|b|<=100000,且單個檔案的字元總數小於2e6
其中70%的資料答案為奇數哦
因為沒有處理掉字串尾巴上多餘的'\r',所以為了防止讀到'\r' 推薦使用scanf("%s");
output
輸出c的長度
sampleinput
bbabbbcbcbbbdddebbbabbbccadddbbba
dggdgzz
dggdbb
aaabbb
acbdbca
bcadacb
sampleoutput
5401
hint:對於第乙個資料c取bbabb
對於第二個資料c取dggd
用馬拉車預處理,這樣可以o(1)判斷任意區間是否是回文。 然後就是用二分答案的長度,用雜湊o(n)計算是否有長度為len的公
共回文子串,注意。 二分時奇偶回文要分開二分。因為如何有2k+2長度的公共回文。肯定也會有2k長度的公共回文,但是不保證也
有2k+1的長度的公共回文。。資料裡70%的答案是奇的。所以你只二分奇數長度即可得到70分. 如果不想奇偶分開討論的話,可以用馬拉車的技巧,轉化為全部都是奇回文
細節在**中有解釋
#includetypedef unsigned long long ull;const int maxn=100005;
const ull p=131;
using namespace std;
char str1[maxn],str2[maxn];
ull f1[maxn],f2[maxn],p[maxn];
int len1,len2,tmp_len;
int len[maxn<<1];
char tmp[maxn<<1];
void init()
ans=max(ans,len[i]);
}}map< ull,int >mp;
bool cheak(int m)
}for(int i=0; str2[i+m-1]; i++) ///列舉第二個字串的起點
}return false;
}int main()
else
}ans=max(ans,l*2);
l=l-1,r=min(len1,len2)/2+1;
while(l+1else
}ans=max(ans,l*2+1);
printf("%d\n",ans);
}return 0;
}
一道數論題目
有100盞燈,編號1 100,初始時都是亮著燈。有一百個小孩,編號1 100。每盞燈對應乙個開關,按下時燈亮,再按則燈滅。讓這一百個小孩依次按開關,每個小孩只能按其編號倍數的開關。比如1號小孩可以按所有開關,2號小孩只能按編號為偶數的開關,以此類推。請問所有的小孩都按過開關以後 注意 每個小孩都必須...
一道神奇的數論題
題面 時間限制 3 s 記憶體限制 256 mb lc出去浪,發現了一大堆鑽石,可是鑽石在有規律地消失,lc想知道最後剩下鑽石的價值。給出p 1堆鑽石,第i堆鑽石含有i 1個不同的鑽石.第i堆鑽石有1 i i 1 的概率不消失,每個鑽石不消失的概率為1 2,第i堆每個鑽石權值為2 i 1 求最後獲得...
hdu 1695 一道綜合性很強的數論題
這題想了好久,也打了好久。挺不錯的一道數論題。題目是要求兩個集合 1.b,1.d 中有多少對數的最大公約數為k,此問題等價於求兩個集合 1.b k,1.d k 中有多少對數互質。不妨設b 1.b 與 1.b 中有多少對數互質 1.b 與 b 1.d 中有多少對數互質 問題1就是尤拉函式的應用,就不詳...