1. 程式人生 > >藍橋杯-演算法提高-週期字串

藍橋杯-演算法提高-週期字串

演算法提高 週期字串 問題描述   右右喜歡聽故事,但是右右的媽媽總是講一些“從前有座山,山裡有座廟,廟裡有個老和尚給小和尚講故事,講的什麼呢?從前有座山……”這樣迴圈的故事來搪塞右右。
  我們定義,如果一個字串是以一個或者一個以上的長度為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;
}