栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

POJ 1961 循环子串

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

POJ 1961  循环子串

题意:输出每一个前缀的循环节,没有则不用输出。

思路:画出循环子串,观察期fail数组的特点。在思考加上什么条件使得fail数组称为判断循环串的充要条件。

#include 
#include 
using namespace std;
const int maxn = 1000005;
int f[maxn];
void get_fail( char* P,int *f ){
    int m = strlen(P);
    f[0] = -1;
    for( int i = 1;i < m;i++ ){
        int j = f[i-1];
        while( j != -1 && P[j+1]!=P[i] )j = f[j];
        if( P[j+1]==P[i] ) f[i] = j+1;
        else f[i] = -1;
    }
}
char str[maxn];
int main(){
    int n,ca = 0;
    while(1==scanf("%d",&n) && n ){
        printf("Test case #%dn",++ca);
        scanf("%s",str);
        get_fail( str,f );
        for( int i = 0;i < n;i++ ){
            if( f[i]*2+1-i >= 0 && (f[i]*2+1-i)%( i-f[i] ) == 0 ){
                int j = i-f[i];
                int k = (i+1)/j;
                printf("%d %dn",i+1,k);
            }
        }
        puts("");
    }
    return 0;
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/268749.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号