10.6比賽 T3
阿新 • • 發佈:2017-10-06
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);View Code13 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 }
10.6比賽 T3