POJ 1961
Posted ukcxrtjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1961相关的知识,希望对你有一定的参考价值。
题面:http://poj.org/problem?id=1961
本题的重点在于如果一个串是周期串的话,那么每次错位的位置应该是一个循环节。所以当i-next[i]=x*i时,此时next[i]就是一个循环节。
Code:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<vector>
using namespace std;
#define INF 0xfffffff
#define N 1000010
char s[N];
int next[N];
void kmp(int k)
int i,j=-1;
next[0] = -1;
for(i = 1 ; i < k ; i++)
while(j>-1&&s[i]!=s[j+1])
j = next[j];
if(s[i]==s[j+1])
j++;
next[i] = j;
int main()
int n,i;
int kk=1;
while(scanf("%d",&n)!=EOF)
if(!n) break;
memset(next,0,sizeof(next));
for(i = 0 ; i < n ; i++)
scanf("%c",&s[i]);
kmp(n);
printf("Test case #%d\n",kk++);
for(i = 0 ;i < n ; i++)
if(next[i]!=-1&&(i+1)%(i-next[i])==0)
printf("%d %d\n",i+1,(i+1)/(i-next[i]));
puts("");
return 0;
以上是关于POJ 1961的主要内容,如果未能解决你的问题,请参考以下文章