1. 程式人生 > >10.6比賽 T3

10.6比賽 T3

sed 描述 輸入數據 sin 顏色 aac != 毛線 ostream

絲(filament)
【題目描述】
小 H 對於毛線球情有獨鐘,這一天他從中抽出了一根絲。
他發現,絲可以被等分成 n 段,且每一段都有一種顏色 ai,而令
他驚奇的是,從這一段絲似乎可以看出顏色是有循環節的,而且是純
循環,由此他推斷整個毛線球就是一段 純循環的顏色序列。假設小 H
抽出的這一根絲恰好是整團毛線的 一端, 他希望找出 可能的最小的循
環節。
【輸入數據】
第一行一個正整數 T,表示數據組數。
接下來每兩行表示一組數據:第一行一個正整數 n,表示絲的長
度;第二行 n 個整數,表示每一段的顏色, 規定第 1 段為整團毛線的
一端。
【輸出數據】
輸出共 T 行,對於每組數據,輸出一行表示最小循環節長度。
【樣例輸入】
2
3
1 2 1
2
1 1
【樣例輸出】
2
1
【數據範圍】
對於 20%的數據,n<=500;
對於 40%的數據,n<=2000;
另外 20%的數據,滿足最小循環節長度整除 n。
對於 100%的數據,1<=T<=5,1<=T*n<=10^6,0<=|ai|<=10^9。
【樣例解釋】
第一組數據,循環節為 1 2,整團毛線可能是 1 2 1 2……。
第二組數據,循環節為 1,整團毛線可能是 1 1 1 1……。

思路:

用一個kmp將使用數從左到右過一遍,第一個搜到的數就是答案。

代碼:

技術分享
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 using namespace std;
 6 int t,n;
 7 int a[1000001],x[1000001];
 8 int main()
 9 {
10     int i,h;
11     //freopen("filament.in","r",stdin);
12     //freopen("filament.out","w",stdout);
13 cin>>t; 14 while(t--) 15 { 16 cin>>n; 17 for(i=1;i<=n;i++) 18 { 19 cin>>a[i]; 20 } 21 x[0]=-1; 22 h=-1; 23 for(i=1;i<=n;i++) 24 { 25 while(h>-1&&a[h+1]!=a[i]) 26 {
27 h=x[h]; 28 } 29 h++; 30 x[i]=h; 31 } 32 cout<<n-x[n]<<endl; 33 } 34 return 0; 35 }
View Code

10.6比賽 T3