POJ 1961 HDU 1358 KMP的性质

原创 2012年03月22日 21:41:17

题目大意:求给出串的每个前缀串的重复次数。
例如aabaabaabaab;
1.aa中前缀a出现2次。
2.aabaab中前缀aab出现2次
3.aabaabaab中前缀aab出现3次
4.aabaabaabaab中前缀aab出现4次.
大概就是这么个意思。
这里利用了kmp中的next标记的性质。
看看这个字符串

下标:1  2  3  4  5 6  7   8 9  10 11 12

原串:a  a  b  a  a  b  a  a  b   a   a   b

next:  0  1  2  1  2  3  4  5  6  7    8  9

用下标i减去next[i]即为(i-next)匹配的前缀的长度.
若这个数能被整除,整除的个数即为使用该前缀的个数。
so就是这样.....

#include<iostream>
using namespace std;

char t[1111111];
int len,next[1111111];
int ri[1111111],rl[1111111];

void setNext()
{
     int j=0,k=-1;
     next[0]=-1;
     while( j<len )
     {
            if( k==-1|| t[j]==t[k] )
                next[++j]=++k;
            else
                k=next[k];
     }
}

int main()
{
    int Ncase=0;
    while( scanf("%d",&len)!=EOF&&len!=0 )
    {
           scanf( "%s",&t );
           setNext();
           printf( "Test case #%d\n",++Ncase );
           for( int i=2;i<=len;i++ )
                if(  i%(i-next[i])==0&&i/(i-next[i])>1 )
                     printf( "%d %d\n",i,i/(i-next[i]) );
           printf( "\n" );
    }
    return 0;
}


版权声明:本文为博主原创文章,转载请写明出处。

相关文章推荐

Period (poj 1961&&hdu 1358)KMP

题意:求长度为i(2

poj1961 & hdu 1358 Period(KMP)

poj1961 & hdu 1358 Period(KMP)

KMP入门题 Hdu 1711 2594 3746 HUST 1010 Poj 3461 2752 2406 1961 FZU 1901

三道KMP算法的基础题,有关理论可以参考 KMP及其next数组性质学习小记 Poj1961 + Poj2406 - whyorwhnt的专栏 HUST 1010 The Minimum Len...

poj 1961 2406 让你彻底理解KMP的next[]数组的两个题目

两题运用kmp思路基本上是一样的,都是从头开始找相同前缀的   运用next数组原理,让你充分理解,即使不理解,你也记住了,哈哈 poj 2406 Power Strings...

Period POJ - 1961(kmp求最大周期,最小循环节)

For each prefix of a given string S with N characters (each character has an ASCII code between 97 a...

KMP以及next数组应用--POJ1961

题目地址:点击打开链接http://poj.org/problem?id=1961 百万级字符串..无从下手,T到死 从网上查到要用KMP。。我之前也是看过的,欺负我读书少么,KMP与这个题有神马...

【KMP】 poj1961 Period

Period http://poj.org/problem?id=1961 Description For each prefix of a given string S wit...
  • ACM_Ted
  • ACM_Ted
  • 2012年08月02日 09:32
  • 375

POJ_1961_Period_KMP

最近母校试点开

Kmp找字符串循环节——Period ( POJ 1961 )

题目链接: http://poj.org/problem?id=1961 分析: 给出一个字符串长度为N,从左变开始取2~N个字符出来构成一个新字符串,若新字符串能被一个最短的循环节构成则输出新字...
  • FeBr2
  • FeBr2
  • 2016年07月15日 15:09
  • 913

poj 1961 KMP算法的应用

多久了,,,多久了,,,,两天了,,,,终于ac了一道题,,还是一道水题。。。。。。悲剧,,,,杭电上的一道题,,,一直看不懂题意,看不懂,,纠结,,,,就这样一直看了两天,,还是不懂,,,受打击了,...
  • wmn_wmn
  • wmn_wmn
  • 2011年11月09日 21:47
  • 794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1961 HDU 1358 KMP的性质
举报原因:
原因补充:

(最多只允许输入30个字)