字串KMP 一些題

2022-05-16 02:07:39 字數 1997 閱讀 6116

利用失配陣列nxt

最長的乙個「前字尾」是1~nxt[n],那麼下乙個是多少?

#includeusing

namespace

std;

#define rg register

const

int n=1000000+5,m=10000+5,inf=0x3f3f3f3f,p=99999997

;int

l,j,cnt,nxt[n],ans[n];

char

s[n];

intmain()

int pos=l;

while

(nxt[pos])

ans[++cnt]=nxt[pos],pos=nxt[pos];

for(int i=cnt;i;--i) printf("

%d "

,ans[i]);

printf(

"%d\n

",l);

}return0;

}

給定乙個字串,求它最短的迴圈節長度

考慮n-next[n]與n的關係

若n不是n-next[n]的倍數,如何證明最短迴圈節長度只能是1

假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len-next[len],子串為s[0…len-next[len]-1]。

(1)如果len可以被len - next[len]整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t=len/l。

(2)如果不能,說明還需要再新增幾個字母才能補全。需要補的個數是迴圈個數l-len%l=l-(len-l)%l=l-next[len]%l,l=len-next[len]。

#include #include 

#include

#include

using

namespace

std;

#define rg register

const

int n=1000000+5,m=10000+5,inf=0x3f3f3f3f,p=99999997

;int

t,n,l,j,nxt[n],ans[n];

char

s[n];

intmain()

l=n-nxt[n];

if(n%l) puts("1"

);

else printf("

%d\n

",n/l);

}return0;

}

給定乙個r*c的二維矩陣,其中c<= 75,求面積最小的長方形生成單元

例如:ababa

ababa 

則答案為2,即ab

思路:對每一維分別做一次kmp,在做這一維時,將另一維整體看成字元

一維情況下,答案是n-next[n]

二維情況下,答案是(r-next[r])*(c-next[c])

#include #include 

#include

#include

using

namespace

std;

#define max(x,y) (x)>(y)?(x):(y)

#define min(x,y) (x)>(y)?(y):(x)

#define ll long long

#define rg register

const

int n=10000+5,m=10000+5,inf=0x3f3f3f3f,p=99999997

;int r,c,w=0,h=0

,nxt[n],ans[n];

char

s[n][n];

int kmp(int pos,int

flag)

return c-nxt[c];

}else

return r-nxt[r];

}}int

main()

一些字串函式

1.right location,somenumber left location,somenumber select right location,2 from my contacts 返回location列中所有右數兩個字元 select left location,2 from my cont...

字串的一些知識

1.string轉換成整數 string a 123 integer.parseint a throws numberformatexception integer.valueof a 呼叫parseint 丟擲異常同上 integer.valueof 8 56 而不是預想的8 可以用 8 0 2....

關於字串的一些。。。

首先呼叫這些函式需要使用標頭檔案include 1 des src abcd xyz abcdxyz char mystrcat char des,const char src 字串連線 2 字串比較 0,0,0 int mystrcmp const char str1,const char str...