FZU 1901 Period II

来源:互联网 发布:游禧科技有限公司知乎 编辑:程序博客网 时间:2024/06/06 00:06

这里写图片描述
这里写图片描述

题目大意:给出一个字符串,要求找出所有的p,使得说s[i] = s[i+p] (i < len - p - 1)。

解题思路:其实就是求所有的前缀后缀串,p =len, 然后一直循环p = a[p]; 直到p = 0,其他的p值,字符串长度len- p都是答案。

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <map>#include <cmath>#include <queue>#include <string>using namespace std;const int maxn=1000005;char str[maxn];int a[maxn];int b[maxn];int n;void init(int len){     int i=-1,j=0;     a[0]=-1;     while(j<len)     {         if(i==-1||str[i]==str[j])         {             ++i,++j;             a[j]=i;         }         else          i=a[i];     }}int main(){    int t;    int num=1;    scanf("%d",&t);    while(t--)    {        int cnt=0;        int k=0;        scanf("%s",str);        int len=strlen(str);        init(len);        int i=a[len];        b[k++]=len-i;         while(i!=0)         {             cnt++;             i=a[i];             b[k++]=len-i;         }         cnt++;         printf("Case #%d: %d\n",num++,cnt);         for(int i=0;i<k;i++)            printf("%d%c",b[i],i==k-1?'\n':' ');    }    return 0;}

END!!!!!!!!!!!!!!!!!!!!!!!

3 0