zoukankan      html  css  js  c++  java
  • 【题解】UVA10298 Power String(KMP)

    UVA10298:https://www.luogu.org/problemnew/show/UVA10298

    思路

    设P[x]数组为 前x个字符的最大前缀长度等于后缀字串

    由P数组的定义我们可以知道 对于给定的长度为n字符串

    n-P[n]所在位置就是这个字符串的重复最长子串的最后一个字符的位置

    如果这个字符串真的是由其中的一个子串循环而成 那么它的长度肯定是n-P[n]的倍数


    因此我们用KMP预处理出给定字符串的所有P数组

    判断n是否整除n-P[n]即可 如果整除ans=n/(n-P[n])

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define maxn 1000010
    char a[maxn];
    int p[maxn];
    int len,j;
    int main()
    {
        for(;;)//死循环 
        {
            cin>>a+1;//从下标1开始输入 
            if(a[1]=='.') break;
            len=strlen(a+1);
            for(int i=2;i<=len;i++)//常规KMP 
            {
                while(j&&a[j+1]!=a[i]) j=p[j]; 
                if(a[j+1]==a[i]) j++;
                p[i]=j;
            }
            if(len%(len-p[len])==0)//如果可以整除 
                cout<<len/(len-p[len])<<endl;//输出ans 
            else
                cout<<1<<endl;//无解 
            j=0;//记得清0 
        }
    } 
  • 相关阅读:
    p4 view mapping及其特殊字符
    Build Release Blogs
    Linux技术blogs
    为什么使用tmux
    linux下安装wine
    PythonDjango的windows环境
    tmux安装
    基于云端的开发平台Team Foundation Service
    linux网络配置之setup命令
    Centos6.2设置静态ip和dns
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9781566.html
Copyright © 2011-2022 走看看