pku 1961 KMP period 解题报告

来源:互联网 发布:金蝶软件进销存 编辑:程序博客网 时间:2024/05/16 12:17

一、题目:period

二、题意:http://acm.pku.edu.cn/JudgeOnline/problem?id=1961

三、解决办法:

         赤裸裸的kmp算法

四、源代码:


#include "stdio.h"
#include "string.h"

#define MAX 1000010

char s[MAX];
int next[MAX];

void get_next()
{
 int i, j;
 int N = strlen(s);

 i = 0;
 next[0] = -1;
 j = -1;
 while (i < N)
 {
  if (j == -1 || s[i] == s[j])
  {
   i++;
   j++;
   next[i] = j;
  }
  else
  {
   j = next[j];
  }
 }
}

int main()
{
 freopen("1.txt", "r", stdin);   
 int i, j;      //辅助值
 int k = 1;     //程序运行的次数
 int N;         //数组的长度
 int p = 0;

 while (scanf("%d", &N) && N != 0)
 {
  getchar();
  gets(s);
  printf("Test case #%d/n", k);
  get_next();
  for (i = 2; i <= N; i++)
  {
   j = i - next[i];
   if (i % j == 0 && i / j > 1)
            {
    printf("%d %d/n", i, i / j);
   }
  }
  k++;
  printf("/n");
 }  
 return 0;
}

 

原创粉丝点击