剪花布條 kmp模板

2022-05-25 03:33:08 字數 1240 閱讀 5543

一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?

input

輸入中含有一些資料,分別是成對出現的花布條和小飾條,其布條都是用可見ascii字元表示的,可見的ascii字元有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字元長。如果遇見#字元,則不再進行工作。

output

輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。

sample input

abcde a3

aaaaaa aa

sample output03

題意:找出乙個字串中有多少給定的子串

pre[i]的含義是長度為i的子串的最大字首字尾長度。

(關鍵是找出pre陣列)

順便寫一下最小迴圈節:

長度為len的字串的最小迴圈節為l=(len-pre[len]);

1.如果len%l==0,則說明字串完全由迴圈節迴圈組成,且迴圈週期為len/l。

2.否則,若要補成完全由迴圈節迴圈組成的字串,則需要

l-len%l=l-(len-l)%l=l-pre[len]%l個字元。

參考大神部落格:

#include #include #include #include #include #define ll long long

using namespace std;

const int maxn=1e4+10;

const int maxm=1e4+10;

char text[maxn],pattern[maxm];

int pre[maxm];

int ans;

void get_pre(int m)

else

j=pre[j];

} }void kmp_search()

if(text[i]==pattern[j])

else

}} }

int main()

scanf("%s",text);

if(text[0]=='#')

break;

scanf("%s",pattern);

ans=0;

kmp_search();

printf("%d\n",ans);

}return 0;

}

剪花布條 KMP

剪花布條 hdu 2087 一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?input 輸入中含有一些資料,分別是成對出現的花布條和小飾條,其布條都是用可見ascii字元表示的,可見的ascii字元有多少個...

剪花布條 (KMP)

一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?input 輸入中含有一些資料,分別是成對出現的花布條和小飾條,其布條都是用可見ascii字元表示的,可見的ascii字元有多少個,布條的花紋也有多少種花樣。...

剪花布條 (KMP)

一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?input 輸入中含有一些資料,分別是成對出現的花布條和小飾條,其布條都是用可見ascii字元表示的,可見的ascii字元有多少個,布條的花紋也有多少種花樣。...