1. 程式人生 > >poj 2406 KMP

poj 2406 KMP

這道題是學完kmp之後留的作業。。應該是最水的那種,但我對kmp本身理解的 還不是太好,所以雖然知道是用kmp,但還是無從下手,後來看了題解,還是沒看懂。。然後第二天線代課上溜著溜著號突然就想明白了點

把abcdefg這些字母都看為一段字串,然後如果匹配到了abcdefg

                                                                                            abcdefg這樣的情況然後i就到頭了,我去看j的情況,如果l-j是l的約數,那就說明整個字串能均分為好幾個長度和g一樣的字串,那麼abcdefg長度相等,a=b,b=c,c=d。。。然後這樣就是最多的情況;如果不是約數,那麼感覺一下好像就不能分。。(還是沒完全明白。。)然後就輸出1

AC程式碼:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[1100000];
int next[1100000];
void get_next()
{
    int i=0,j=-1;
    int l=strlen(s);
    next[0]=-1;
    while(i<l){
        if(j==-1||s[i]==s[j]){
            i++;j++;
            if(s[i]==s[j])
                next[i]=next[j];
            else
                next[i]=j;
        }
        else
            j=next[j];
    }
    if(l%(l-j)==0)cout<<l/(l-j)<<endl;
    else cout<<'1'<<endl;
}
int main()
{
    while(~scanf("%s",&s))
    {
        if(!strcmp(s,"."))break;
        else get_next();
    }
    return 0;
}
AC圖圖圖圖圖: