提高1 题目ID:8624 最小循环节

第7点 TLE了,求调
题目:
最小循环节
题目ID:8624必做题100分
最新提交:
Time Limit Exceeded
90 分
历史最高:
Time Limit Exceeded
90 分
时间限制: 1000ms
空间限制: 524288kB
题目描述
题目描述:
一个字符串 s 的循环节为 t,当且仅当 s 是由若干个 t 连接而成。例如 ab 就是 abababab 的循环节,同时 abab 也是 abababab 的循环节,但它们都不是 ababa 的循环节。

现给定 s,求 s 的长度最小的循环节。

输入格式:
第一行输入一个正整数 n。

第二行输入一个长度为 n 的字符串 s。

保证 s 仅有小写字母构成。

输出格式:
一行一个正整数,表示循环节长度的最小值。

样例输入:
10
ababcababc
样例输出:
5
数据规模:
1≤n≤106。




代码:
#include<bits/stdc++.h>
using namespace std;
int n[1000010],a,x,i;
string b;
int main(){
  scanf("%d",&a);
  cin>>b;
  for(i=1;i<a;i++){
    if(b[x]==b[i]){
      x++;
    }
    else{
      while(x and b[x]!=b[i]){
        x=n[x];
      }
    }
    n[i]=x;
  }
  printf("%d",(a%(a-n[a-1])?a:a-n[a-1]));
  return 0;
}