日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 2406 还是KMP的简单应用

發布時間:2025/3/15 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 2406 还是KMP的简单应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??????? 記住KMP是多計算一位的。其中next[i]為不為自身的最大首尾重復子串長度。

?????? 位移j=i-next[i]可以看作是構成字符串s的字串(如果i%j==0,存在這樣的構成),相應的重復次數也就是n/d。

???????? a? b ?c ?d? *

next:-1 0? 0? 0 0?? 這時j=i-next[i];? 結果是j==i;于是得到i/j=1.

???????? a? b? c? a? *

next:-1 0? 0? 0 1? 這時j=i-next[i]; 結果是i%j!=0.但是結果還是1。所以這題要考慮如果i%j!=0時也要輸出1.即自身。這只是字串等于自身的一種情況。上面的那種情況也是一種

??

#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

#define N 1000001
int next[N];

void get_next(char *s)
{
int i=0,j=-1,len=strlen(s);
next[i]=j;
while(i<len)
{
while(j>=0 && s[i]!=s[j]) j=next[j];
i++; j++;
next[i]=j;
}
}

int main()
{
char str[N];
int i,j;
freopen("acm.txt","r",stdin);
while(scanf("%s",str)!=EOF && str[0]!='.')
{
get_next(str);
i=strlen(str);
j=i-next[i];
if(i%j==0)
printf("%d\n",i/j);
else
printf("1\n");
}
return 0;
}

?

轉載于:https://www.cnblogs.com/Jason-Damon/archive/2012/04/04/2431819.html

總結

以上是生活随笔為你收集整理的poj 2406 还是KMP的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。