AcWing 141. 【java】周期
原题链接
简单
作者:
tt2767
,
2019-12-17 23:43:00
,
所有人可见
,
阅读 859
// java又超时,本地跑也用了3s,没有warmup太吃亏了,竞赛党勿用。。。。。
import java.util.*;
public class Main{
void run(){
int c = 1;
while (c > 0){
int n = jin.nextInt();
if (n == 0) break;
String string = jin.next();
char[] str = new char[n+1];
for (int i = 1 ;i <=n ; i++) str[i] = string.charAt(i-1); // 可能是这步耗时增加常数了
System.out.printf("Test case #%d\n", c++);
solve(n, str);
}
}
void solve(int n, char[] str){
int[] next = getNext(n, str);
for (int i = 2 ; i <= n ; i++){
int t = i - next[i];
if (i > t && i % t == 0) System.out.printf("%d %d\n", i, i / t); // 这里开始落下了i > t 并且写成了t % i
// i > t 是因为要 i / t > 1
// 因为 i > t , 并且 t为第一个循环节末尾值的下表,所以需要 i % t
}
System.out.println();
}
int[] getNext(int n, char[] str){
for (int i = 2, j = 0 ; i <= n ; i++){
while(j > 0 && str[i] != str[j+1]) j = next[j];
if (str[i] == str[j+1]) j++;
next[i] = j;
}
return next;
}
private int[] next = new int[1000002];
private Scanner jin = new Scanner(System.in);
public static void main(String[] args) throws Exception {new Main().run();}
}
Java不建议用Scanner, 它里面用了正则,行数一多非常慢,用BufferedReader, 另外printf比print和print的耗时都要高,我个人是喜欢用一个StringBuilder不停的append最后统一println 可以试一下 应该就不会超时了
Tks,我回去试下哈。