poj 2406 KMP
阿新 • • 發佈:2018-12-24
這道題是學完kmp之後留的作業。。應該是最水的那種,但我對kmp本身理解的 還不是太好,所以雖然知道是用kmp,但還是無從下手,後來看了題解,還是沒看懂。。然後第二天線代課上溜著溜著號突然就想明白了點
把abcdefg這些字母都看為一段字串,然後如果匹配到了abcdefg
abcdefg這樣的情況然後i就到頭了,我去看j的情況,如果l-j是l的約數,那就說明整個字串能均分為好幾個長度和g一樣的字串,那麼abcdefg長度相等,a=b,b=c,c=d。。。然後這樣就是最多的情況;如果不是約數,那麼感覺一下好像就不能分。。(還是沒完全明白。。)然後就輸出1
AC程式碼:
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; }