字串總結?

2021-09-05 09:00:51 字數 4085 閱讀 3001

其實就是模板彙總好伐

1、字串hash

可以解決一切字串問題。

複雜度成迷。

#include

using

namespace std;

#define maxn 10000

#define read(x) scanf("%d",&x)

#define maxm 1500

#define ull unsigned long long

#define p 131

int n;

char a[maxn+5]

[maxm+5]

;ull hash[maxn+5]

;ull make_hash

(int x)

return y;

}int

main()

sort

(hash+

1,hash+n+1)

;int cnt=0;

for(

int i=

1;i<=n;i++

)printf

("%d"

,cnt)

;return0;

}

2、manacher演算法

求最長回文子串長度。

複雜度o(n)

#include

using

namespace std;

#define maxn 22000000

char b[maxn+5]

,a[maxn+5]

;int n;

int p[maxn+5]

;int

main()

a[n*2]

='#';

n*=2;

n-=1;

int id=

0,mx=0;

p[0]=

1;for(

int i=

1;i<=n;i++)}

int ans=0;

for(

int i=

1;i<=n;i++

)printf

("%d"

,ans)

;return0;

}

3、kmp

單文字串、單模式串 字串匹配。

複雜度o(n)

#include

using

namespace std;

#define maxn 1000000

char a[maxn+5]

,b[maxn+5]

;//a為文字串,b為模式串

int n,m;

//a、b的長度

int nxt[maxn+5]

=;//0~i的公共前字尾長

void

readin()

void

make_nxt()

nxt[i+1]

=j+1;}

//此時的nxt需整體前移

for(

int i=

0;i) nxt[i]

=nxt[i+1]

;}void

mtch()

if(a[i]

==b[j]

) j++

;//為了防止j==0要加一步判斷

if(j==m)

}for

(int i=

0;i)printf

("%d "

,nxt[i]);

}int

main()

4、ac自動機

本質 trie + kmp 。

單文字串、多模式串 字串匹配。

複雜度大概o(n+m)。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define maxn 1000000

#define maxs 26

struct ac

void

insert

(char

* x,

int len)

u=ch[u]

[y];

} val[u]++;

}void

make_fail()

while

(!que.

empty()

) que.

push

(ch[u]

[i])

; fail[ch[u]

[i]]

=ch[fail[u]

][i];}

}}void

find

(char

* s,

int len)}}

};int n;

ac ac;

intmain()

ac.make_fail()

;char s[maxn+5]

;scanf

("%s"

,s);

ac.find

(s,strlen

(s))

;printf

("%d"

,ac.sum)

;return0;

}

#include

using

namespace std;

#define maxn 150

#define maxd 70

#define maxm maxn*maxd

#define maxa 1000000

#define s 26

int n;

struct ac

void

insert

(char

* x,

int len,

int j)

u=ch[u]

[y];

} val[u]++;

mp[j]

=u;}

void

make_fail()

while

(!que.

empty()

)else}}

}void

find()

}void

readin()

make_fail()

;scanf

("%s"

,a);

}void

print()

printf

("%d\n"

,ans)

;for

(int i=

1; i<=n; i++)}

}};

ac ac;

intmain()

return0;

}

5、sa

字尾排序和lcs問題,複雜度o(n log n)

基於倍增的低效演算法。

sa:字尾陣列

rk:i 的排名

tax、tp:桶

#include

using

namespace std;

#define maxn 1000000

int n,m;

char a[maxn+5]

;int sa[maxn+5]

,rk[maxn+5]

;int tax[maxn+5]

,tp[maxn+5]

;void

readin()

void

rsort()

void

makesa()

if(num==n)

break

; m=num;}}

intmain()

字串總結

字串輸入輸出 getchar 與putchar include include using namespace std int main 兩種輸入方式 scanf c x 只讀取乙個字元 scanf s x 遇到空格,換行才會停止 cin與scanf s x 的作用大致相同 c char st 10...

字串總結

1 找出回文子串 分析 對於回文子串,最深的印象就是正序和倒序產生的字元相同。其實更深刻的表述方式應該是去除首尾字元後,裡面的依然是個回文子串。這一點也是我沒有想到的。利用動態規劃,相當於乙個遞迴歸納的想法,只要s i 1 j 1 是個回文子串,那麼在s i s j 時,s i j 就是個回文子串。...

字串 總結

一級目錄 輸入字元 cin 不得輸入空格 a getchar 可輸入空格 可輸入空格 gets a fgets a,sizeof a stdin 注意 當使用gets 和fgets 給字元陣列賦值時,前面如果使用過cin輸入,則需要getchar 吸收上一次輸入時剩下的回車 isdigit int ...