CSU2188: Substring
生活随笔
收集整理的這篇文章主要介紹了
CSU2188: Substring
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
FST 是一名可憐的 ACMer,他很強(qiáng),但是經(jīng)常 fst,所以 rating 一直低迷。 但是重點(diǎn)在于,他真的很強(qiáng)!他發(fā)明了一種奇特的加密方式,這種加密方式只有 ACMer 才能破解。 這種加密方式是這樣的:對(duì)于一個(gè) 01 串,他會(huì)構(gòu)造另一個(gè) 01 串,使得原串是在新串 中沒有出現(xiàn)過的最短的串。 現(xiàn)在 FST 已經(jīng)加密好了一個(gè)串,但是他的加密方式有些 BUG,導(dǎo)致沒出現(xiàn)過的最短的 串不止一個(gè),他感覺非常懊惱,所以他希望計(jì)算出沒出現(xiàn)過的最短的串的長度。
Input
單組數(shù)據(jù) 一行,一個(gè) 01 串,字符串串長小于等于10^?5
Output
一行,一個(gè)正整數(shù),表示沒有出現(xiàn)過的最短串的長度
Sample Input
100010110011101Sample Output
4題意:在一個(gè)很長的串內(nèi)找到一個(gè)沒有出現(xiàn)過最短的子串,由于串比較長,所以我們不能直接對(duì)于字符串進(jìn)行處理。我們可以換一個(gè)思想,從答案的長度入手,每次枚舉答案的長度,然后把這個(gè)很長的子串拆分很多這個(gè)長度的子串,
放到set當(dāng)中存儲(chǔ),利用set的去重,如果最后的set的size()<2^(ans)也就是小于我們枚舉長度能產(chǎn)生所有的可能的串的數(shù)量,那么就說明當(dāng)中肯定有一個(gè)串沒有出現(xiàn)過。
就可以得到答案。
這題也可以用字符串hash去做,時(shí)間復(fù)雜度會(huì)比set+string的要小些。但是思想是一樣的。 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <set> using namespace std;string s; set<string>ss; int main() {cin>>s;int len=s.length();string temp="";int ans=1;while(1){ss.clear();for(int i=0;i<=len-ans;i++){ // cout<<i<<endl;for(int j=i;j<i+ans;j++){temp+=s[j];} // cout<<temp<<endl;ss.insert(temp);temp="";} // cout<<ss.size()<<endl;if(ss.size()<pow(2,ans))break;elseans++;}printf("%d\n",ans);return 0; }/**********************************************************************Problem: 2188User: therangLanguage: C++Result: ACTime:540 msMemory:3580 kb **********************************************************************/
轉(zhuǎn)載于:https://www.cnblogs.com/jkzr/p/9956613.html
總結(jié)
以上是生活随笔為你收集整理的CSU2188: Substring的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异步同步、阻塞非阻塞、异步回调、线程队列
- 下一篇: 提高php编程效率