1. 程式人生 > >D - Cyclic Nacklace HDU-3746

D - Cyclic Nacklace HDU-3746

mat lac cli alt cto 最小 如果 gif urn

題目大意:

給一個t,接下來每個t,給一個串,求出最小循環節下還要增加多少個珠子才完美。(要是都沒啥循環節,就輸出長度)

解題思路:

求出最小循環節 cir:cir=len - next[len] (關於為什麽是這個式子詳見《KMP 專題知識》),然後拿len%cir得到的余數就是已經有的,那麽拿循環節再減掉有的,就是需要增加的。即:cir-len%cir。如果len%cir == 0,而且cir!=len,就意味著一顆都不用增加,因為此時已經是完美的循環了,但是要是cir==len,就說明沒有所謂的循環節,就要加len顆。

參考代碼:

技術分享
 1 #include <iostream>
 2
#include <vector> 3 #include <map> 4 #include <string> 5 #include <queue> 6 #include <stack> 7 #include <set> 8 #include <algorithm> 9 10 #include <cstdio> 11 #include <cstring> 12 #include <cmath> 13 #include <cstdlib> 14 using
namespace std; 15 16 const int INF=0x3f3f3f3f; 17 const int SIZE=10000; 18 typedef long long LL; 19 20 char b[100005]; 21 int nextt[100005]; 22 void nexxt() 23 { 24 memset(nextt,0,sizeof(nextt)); 25 int j=0,k=-1; 26 nextt[0]=-1; 27 int len=strlen(b); 28 while(j<len) 29 { 30 if(k==-1
||b[j]==b[k]) 31 { 32 k++; 33 j++; 34 nextt[j]=k; 35 } 36 else 37 k=nextt[k]; 38 } 39 } 40 41 int main() 42 { 43 int t; 44 scanf("%d",&t); 45 getchar(); 46 while(t--) 47 { 48 gets(b); 49 int len=strlen(b); 50 nexxt(); 51 int cir=len-nextt[len]; 52 if(len%cir==0&&cir!=len) 53 printf("0\n"); 54 else 55 printf("%d\n",cir-nextt[len]%cir); 56 57 } 58 return 0; 59 }
View Code

D - Cyclic Nacklace HDU-3746