藍橋杯-演算法提高-週期字串
阿新 • • 發佈:2019-01-02
演算法提高 週期字串
問題描述
右右喜歡聽故事,但是右右的媽媽總是講一些“從前有座山,山裡有座廟,廟裡有個老和尚給小和尚講故事,講的什麼呢?從前有座山……”這樣迴圈的故事來搪塞右右。
我們定義,如果一個字串是以一個或者一個以上的長度為k的重複字串所連線成的,那麼這個字串就叫做週期為k的串。
例如:
字串’abcabcabcabc’週期為3,因為它是由4個迴圈’abc’組成的。它同樣是以6為週期(兩個重複的’abcabc’)和以12為週期(一個迴圈’abcabcabcabc’)。
右右現在想給他的朋友大灰狼轉述媽媽講的故事,請幫他寫一個程式,可以測定一個字串的最小週期。 輸入格式 一個最大長度為100的無空格的字串。 輸出格式 一個整數,表示輸入的字串的最小週期。 樣例輸入 HaHaHa 樣例輸出 2 樣例輸入 Return0 樣例輸出 7
我們定義,如果一個字串是以一個或者一個以上的長度為k的重複字串所連線成的,那麼這個字串就叫做週期為k的串。
例如:
字串’abcabcabcabc’週期為3,因為它是由4個迴圈’abc’組成的。它同樣是以6為週期(兩個重複的’abcabc’)和以12為週期(一個迴圈’abcabcabcabc’)。
右右現在想給他的朋友大灰狼轉述媽媽講的故事,請幫他寫一個程式,可以測定一個字串的最小週期。 輸入格式 一個最大長度為100的無空格的字串。 輸出格式 一個整數,表示輸入的字串的最小週期。 樣例輸入 HaHaHa 樣例輸出 2 樣例輸入 Return0 樣例輸出 7
#include<iostream> #include<string> using namespace std; int main() { int k;//週期 string str; cin>>str; int flage=0; //長度如果是質數直接輸出長度 for(int i=1;i<=str.size();i++) if(str.size()%i==0) flage++; if(flage==2) { cout<<str.size()<<endl; return 0;} for(int k=1;k<=str.size();k++) { int flage=0; string s; s.assign(str,0,k); if(k>str.size()/2) { cout<<str.size()<<endl; return 0; } for(int begin=k;begin<=str.size()-k;begin+=k) { string s1; s1.assign(str,begin,k); if(s!=s1) break; else if(s==s1) flage++; } if(flage==str.size()/k-1) { cout<<k<<endl; break; } } return 0; }