码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1961

时间:2019-07-16 15:27:49      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:namespace   int   return   print   har   set   string   cto   ==   

题面: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

标签:namespace   int   return   print   har   set   string   cto   ==   

原文地址:https://www.cnblogs.com/ukcxrtjr/p/11195033.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!