zoukankan      html  css  js  c++  java
  • poj 2406

    KMP的应用

    如果串s有s(1)循环得到,那么s(1~len-1)一定与s(2~len)匹配,并且len-2+1一定是1的倍数,同理如果由s(1~2),s(1~3)......是一样的道理,但肯定不会这么一个一个枚举,可知可由kmp中的next[]来枚举,减小时间复杂度

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=1000000+10;
    char s[maxn];
    int next[maxn];
    void getNext()
    {
        int i,j;
        next[0]=-1;
        int len=strlen(s);
        for(i=0,j=-1;i<len;i++)
        {
            while(j!=-1&&s[j]!=s[i]) j=next[j];
            next[i+1]=++j;
        }
    }
    int main()
    {
        while(scanf("%s",s))
        {
            if(strcmp(s,".")==0) break;
            getNext();
            int len=strlen(s);
            int i=next[len-1];
            while(1)
            {
                while(i!=-1&&s[i]!=s[len-1]) i=next[i];
                if((i==-1)||(i+1)%(len-i-1)==0) break;
                else i=next[i];
            }
            printf("%d\n",len/(len-i-1));
        }
        return 0;
    }



  • 相关阅读:
    常见的无损压缩算法
    多媒体基本概念
    电子商务
    Java正则表达式
    Java 注解
    java泛型
    Java的反射机制
    Java 动态代理
    函数调用约定_stdcall[转]
    要研究的东东啊
  • 原文地址:https://www.cnblogs.com/lj030/p/3065563.html
Copyright © 2011-2022 走看看