模板 字串 字串匹配

2022-05-07 23:21:27 字數 2606 閱讀 8433

計算next陣列的方法是對於長度為n的匹配串,從0到n-1位依次求出字首字尾最大匹配長度。

下面的寫法是僅僅檢測有沒有匹配然後返回第乙個匹配位置,而不是返回所有匹配位置。

#include #include 

#include

using

namespace

std;

const

int n=100

;char str[100],ptr[100];//

父串str和子串ptr

int next[100

];string

ans;

void getnext()//

獲取next陣列

}int kmp(char *a,char *b)//

匹配ab兩串,a為父串

else j=next[j+1];//

到前乙個匹配點

}

if(j>=len2)

return i-j;

else

return -1;}

intmain()

return0;

}

字典樹 - 一對多

其實trie也叫做字首樹。

基本性質

1,根節點不包含字元,除根節點意外每個節點只包含乙個字元。

2,從根節點到某乙個節點,路徑上經過的字元連線起來,為該節點對應的字串。

3,每個節點的所有子節點包含的字串不相同。

優點

可以最大限度地減少無謂的字串比較,故可以用於詞頻統計和大量字串排序。

跟雜湊表比較:

1,最壞情況時間複雜度比hash表好

2,沒有衝突,除非乙個key對應多個值(除key外的其他資訊)

3,自帶排序功能(類似radix sort),先序遍歷trie可以得到排序。

可以用來得到字串最長公共字首**成lca問題/最近公共祖先問題,用tarjan演算法,dfs某個節點的子樹,子樹之間的相互的最近公共祖先就是這個節點)

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

/*trie字典樹

*/struct

tnode

};tnode *root;

tnode*newnode()

//插入函式

void insert(char *s)

p = p->next[x];

}p->sum++;//

這個單詞終止啦}//

匹配函式

bool compare(char *ch)

}return

false;}

void delete(tnode * &top)

intmain()

cin>>m;

for(int i =0;i)

delete(root);

//看見指標就要想到釋放,然而這東西會花時間,所以網上很多人寫acm題就不delete了,我很看不慣這一點。

return0;

}

ac自動機

#include #include 

#include

#include

#include

using

namespace

std;

struct

trie

void

init()

void insert(char s,int

id)

end[now]=id;

}void

build()

}while(!q.empty())}}

}bool used[510

];

bool query(char buf,int n,int

id)

temp =fail[temp];}}

if(!flag)

return

false

; printf(

"web %d:

",id);

for(int i = 1; i <= n; i++)

if(used[i])

printf("%d

",i);

printf("\n

");return

true

; }

};char buf[10010

];trie ac;

intmain()

ac.build();

int ans = 0

; scanf("%d

",&m);

for(int i = 1; i <= m; i++)

printf(

"total: %d\n

",ans);

}return0;

}

模板 kmp字串匹配

題目 kmp字串匹配 資料 syc大佬的部落格 思路 nxt i 字串0 i的最長相等的字首字尾長減1,也就是最長相等字首字尾中的字首的結束位置。比如從i開始查詢到j處時不匹配,nxt j 2,也就是說a段和b段完全相等,因為a是x串的字首,那麼b也是x串的字首,可以直接從b段開始匹配 i j xx...

模板 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 的字...