zoukankan      html  css  js  c++  java
  • pku1961 Period

    求一个字符串中每一个前缀用s’^k(k>1)表示的所有情况。要求输出该前缀的结束位置和k值。

    和2406有基本相同的方法,求出next数组后枚举i,看(1-i) mod(i-next[i])是否大于1,满足条件就输出即可。

    View Code
     1 program pku1961(input,output);
    2 var
    3 n : longint;
    4 ch : char;
    5 s : ansistring;
    6 next : array[0..1000100] of longint;
    7 i,j : longint;
    8 cases : longint;
    9 begin
    10 readln(n);
    11 cases:=0;
    12 while n<>0 do
    13 begin
    14 inc(cases);
    15 s:='';
    16 for i:=1 to n do
    17 begin
    18 read(ch);
    19 s:=s+ch;
    20 end;
    21 readln;
    22 fillchar(next,sizeof(next),0);
    23 j:=0;
    24 next[1]:=0;
    25 for i:=2 to length(s) do
    26 begin
    27 while (j>0)and(s[i]<>s[j+1]) do
    28 j:=next[j];
    29 if s[i]=s[j+1] then
    30 inc(j);
    31 next[i]:=j;
    32 end;
    33 writeln('Test case #',cases);
    34 for i:=2 to length(s) do
    35 if ((i mod (i-next[i]))=0)and((i div (i-next[i]))>1) then
    36 writeln(i,' ',i div (i-next[i]));
    37 writeln;
    38 readln(n);
    39 end;
    40 end.



  • 相关阅读:
    test
    封装和构造方法
    面向对象
    数组的排序
    UDP编程(八)
    多的是面向对象你不知道的事
    面向对象组合的使用
    类成员的进一步阐述
    面向对象初始
    吾日三省吾身
  • 原文地址:https://www.cnblogs.com/neverforget/p/2413880.html
Copyright © 2011-2022 走看看