1. 程式人生 > >UVA - 455(周期串)

UVA - 455(周期串)

names style log %d 思路 int 技巧 clas ios

求一段長度為k的字符串的最小重復周期(k<=80),代碼:

思路:

周期串長度n必然能被k整除,在這一條件下,對周期小於k/2的,進行驗證,驗證k/n-1次,取最先成功的重復周期長度或k為最終結果

小技巧:

如果題目要求“兩結果之間”有換行,那麽對於最後一個case,可利用以下代碼高亮處的方式來處理,使代碼更簡潔美觀巧妙。

#include"iostream"
#include"cctype"
#include"cstring"
using namespace std;
#define maxn 85
//#define local

int judge(char *s,int k,int len)       
{
    
int n=len/k; //倍數/比較幾次 for(int j=1;j<n;j++) for(int i=0;i<k;i++) if(s[i]!=s[i+j*k]) return 0; return 1; } int main() { #ifdef local freopen("UVa_in.txt","r",stdin); // freopen("UVa_out.txt","w",stdout); #endif char s[maxn]; int
cont,len; scanf("%d",&cont); while(cont--){ scanf("%s",s); len=strlen(s); int mark=1; for(int i=1;i<=len/2;i++){ //被比較串的結尾com,由0->len-1 if(len%i==0) if(judge(s,i,len)) { cout
<<i<<endl; mark=0; break; } } if(mark==1) cout<<len<<endl; if(cont)cout<<endl; } return 0; }

UVA - 455(周期串)