2406:Power Strings

keyword

約数 文字列 C++

概要

文字列s(strlen(s) < 1000000)が与えられる。s=a^nなる最大のnを求める問題。
候補はstrlen(s)の約数だけ。またs=a^nであるかどうかの判定はO(strlen(s))でできる。
約数の個数が多いと怪しいけどとりあえず投げてみたら通った。

int main(){
    char str[1000001];
    int n, i, j, k, s, ans;
    while(scanf("%s\n",str)){
        if(!strcmp(str,".")) break;
        n = strlen(str);
        ans = 1;
        vector<int> fs;

        for(i=n;i>=2;i--){
            if(!(n%i)) fs.PB(i);
        }
        s = SZ(fs);

        REP(i,s){
            int step = n/fs[i];
            for(j=0;j<step;j++){
                for(k=j+step;k<n;k+=step)if(str[k-step]!=str[k])break;
                if(k<n)break;
            }
            if(j==step)break;
        }
        if(i<s) ans = fs[i];

        printf("%d\n",ans);
    }

    return 0;
}