題目:kmp字串匹配
資料:syc大佬的部落格
思路:nxt[i] :字串0~i的最長相等的字首字尾長減1,也就是最長相等字首字尾中的字首的結束位置。
比如從i開始查詢到j處時不匹配,nxt[j]=2,也就是說a段和b段完全相等,因為a是x串的字首,那麼b也是x串的字首,可以直接從b段開始匹配:
i j
xx xx xx xx xx xx
yy yy yy yy yy
| a | | b |
update in 2018/10/26 :
天哪我竟然沒看模板就敲出來了……
感覺這一版**好看多了呢……
不同的是這一版**的nxt陣列最長相等的字首字尾長,不用減一,同時兩個字串都從1開始編號。
**:2018/10/26版
#includeusing namespace std;
#define maxn 1000000
#define maxm 1000000
char a[maxn+5],b[maxn+5];
int n,m;
int nxt[maxn+5];
int main()
if(b[i]==b[j+1]) nxt[i]=j+1;
else nxt[i]=0; }
int j=1;
for(int i=1;i<=n;i++)
if(b[j+1]==a[i]) j++;
if(j==m) printf("%d\n",i-m+1); }
for(int i=1;i<=m;i++) printf("%d ",nxt[i]);
return 0;
}
2018/08/12版
#includeusing namespace std;
#define maxn 1000000
char a[maxn+5],b[maxn+5];
int lena,lenb;
int nxt[maxn+5];
int main()
if(b[j+1]==b[i]) nxt[i]=j+1;
else nxt[i]=-1;
} int i=0,j=0;
while(ifor(int i=0;ireturn 0;
}
模板 KMP字串匹配
顧名思義,就是一種用來進行字串匹配的演算法。這種演算法的核心就是乙個nxt陣列,表示在模式串的第i位失配後,應該跳到模式串的哪一位繼續匹配。為什麼要這樣?顯然,因為文字串是不確定的,所以在匹配的時候的nxt陣列肯定是按照模式串建的。其次,為什麼要設乙個nxt陣列呢?模 式串 abc ab c模式串 ...
模板 KMP字串匹配
題目鏈結 給出兩個字串 s1 和 s2,若 s1 的區間 l,r 子串與 s2 完全相同,則稱 s2 在 s1 現了,其出現位置為 l。現在請你求出 s2 在 s1 中所有出現的位置。定義乙個字串 s 的 border 為 s 的乙個非 s 本身的子串 t,滿足 t 既是 s 的字首,又是 s 的字...
模板 KMP字串匹配
顧名思義,就是一種用來進行字串匹配的演算法。這種演算法的核心就是乙個nxt陣列,表示在模式串的第i位失配後,應該跳到模式串的哪一位繼續匹配。為什麼要這樣?顯然,因為文字串是不確定的,所以在匹配的時候的nxt陣列肯定是按照模式串建的。其次,為什麼要設乙個nxt陣列呢?模式串 abcabc 文字串 ab...