C 字串相關演算法總結

2021-09-27 12:05:43 字數 2979 閱讀 9678

在n個字串中查詢某個字串,就像用英語字典查單詞一樣

先翻第乙個字母,然後是第二個,然後是第三個

查詢任意單詞,查詢次數最多隻需要這個單詞的字母個數

根節點不包含字元,除根節點以外每個子節點都只包含乙個字元

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

每個節點的所有子節點包含的字元互不相同

通常在結點設定乙個標誌來標記該節點是否為單詞末尾

應用

const

int maxn =

2e6+5;

//盡量開大

int tree[maxn][30

];//tree[i][j]表示節點i的第j個兒子的節點編號

bool flagg[maxn]

;//表示以該節點結尾是乙個單詞

int tot;

//總節點數

void

insert_

(char

*str)

flagg[root]

= true;

}bool find_

(char

*str)

//查詢操作,按具體要求改動

return true;

}void

init()

//最後清空,節省時間

tot =0;

}

輸入為乙個字串s,z演算法可以求出這個字串每乙個字尾與自身的最長公共字首(lcp),z演算法可以求出乙個陣列z,z[i]表示suffix(i)與字串本身的最長公共字首。

設字串s長度為n。

設字首的左右分別為l,r(s[l,r]是s的字首),z演算法需要對這對值進行維護。i=1時,暴力比較s[0,n-1]與s[1,n-1]可得此時的l和r,同時也得到了z[1]到z[i-1]的值,現在就需要計算z[i]和新的l和r。

如果z[k] < r-i+1,則z[i]必然等於z[k],基於此時,s[k,k+z[k]-1]是s[i,r]的乙個字首,同時在這種情況下l與r不變。

如果z[k]>=r-i+1,根據r的含義可知s[r+1]!=s[r-l+1],z[k]中大於r-i+1的匹配資訊因為s[r+1]!=s[r-l+1]而無效,但這並不意味著s[r+1]!=s[r-i+1],此時根據z[k]可以斷言z[i]至少是r-i+1,是否可以更大需要再進行計算,令l=i,更新r值,並得到此時的z[i]。

void

z_algorithm

(char

*s,int n =0)

else}}

}//過程中每個字元最多被l和r掃到一次

假如我們有乙個字串s,s從下標0開始,則回文樹有以下功能

const

int maxn =

100005

;const

int n =26;

struct palindromic_tree

void init (

)int get_fail (

int x )

void add (

int c )

last = next[cur]

[c];

cnt[last]++;

}void count (

)}

ac自動機是kmp的公升級版。

kmp是單模式匹配演算法,處理在乙個文字串中查詢乙個模式串的問題

ac自動機是多模式匹配演算法,處理在乙個文字串中同時查詢多個不同的模式串

kmp也可以解決多模式匹配問題,但是時間複雜度很高,為 o ((m+n)k)

而ac自動機不需要對字串s做多次kmp,而是只搜尋一遍s,在搜尋時匹配所有的模式串。

kmp是通過查詢p對應的next陣列實現快速匹配的,把所有的p做成乙個字典樹,然後模式匹配時查詢這個p對應的next,就實現了快速匹配的效果

時間複雜度 o((k+n)m),當 m << k 時,(m+n)k >> (k+n)m

模板

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

const

int maxn =2*

1e6+9;

int trie[maxn][26

];//字典樹

int cntword[maxn]

;//記錄該單詞出現次數

int fail[maxn]

;//失敗時的回溯指標

int cnt =0;

void

insertwords

(string s)

cntword[root]++;

//當前節點單詞數+1

}void

getfail()

}//fail[now] ->當前節點now的失敗指標指向的地方

tire[now][i] -> 下乙個字母為i+'a'的節點的下標為tire[now][i]

while

(!q.

empty()

)else

//否則就讓當前節點的這個子節點

//指向當前節點fail指標的這個子節點

trie[now]

[i]= trie[fail[now]

][i];}

}}intquery

(string s)

}return ans;

}int

main()

fail[0]

=0;getfail()

; cin >> s ;

cout <<

query

(s)<< endl;

return0;

}

演算法 字串相關

給定兩個字串s和t。要求設計乙個複雜度為 input s adobecodebanc t abc output banc 要統計target串中字母的個數,一要考慮target串的長度,二要考慮target串中每個字元出現的次數。class solution if lettercnt s left ...

字串的相關總結

字串中的一些功能函式的總結 1 字串類的特點 1.1字串的建立方式 通過直接的賦值 例子 string s1 adc 其實就是將 abc 放入常量池中 如果下一次進行建立字串物件時,如果發現常量池中有相應的資料,就不進行建立。直接用 通過new 例子 string s2 new string abc...

字串相關函式總結

1,char strcpy char s1,const char s2 該函式把s2指向的字串 包括空字元 複製到s1指向的位置,返回值是s1。2,char strncpy char s1,const char s2,size t n 該函式把s2指向的字串,複製到s1指向的位置,複製的字元數不超過...