Noip前的大抱佛腳 字串

2022-04-30 06:27:09 字數 2617 閱讀 7983

tags:noip前的大抱佛腳

目錄字串模板庫

把其中乙個\(reverse\)後,對於每個字元跑一遍fft,打上\(tag\)

如果在某個位置上有串長個\(tag\)那便是匹配上了一處

\(fuzzy search\) 在跑\(fft\)前把模糊門限值的區間內全部置為1,然後同樣的操作

插入ac自動機,老套路了

求兩個串的最長公共子串行,把第二個串的每個值對映到第乙個串上 該值的位置

然後對第二個串求lis即可(最長公共子串就是第二個串的最長連續段)

異或最大值:建trie貪心

與最大值:建trie貪心(1的兒子siz大於2則走)/高維字首和逐位貪心

或最大值:高維字首和逐位貪心

但是求(x+b)^a的最大值呢(scoi2016美味)(當然&操作也是一樣的,這種題通常值域很小)

同樣貪心地做

開值域線段樹,貪心到某一位,需要該位為0或者1,則對應地可以算出x的範圍,查詢是否有在這個範圍之內的x即可

期望\(o(1)\),當然支援查詢多個關鍵字

const int mo=yyb;

struct hashtable

a[mo];

int head[mo],cnt;

void reset()

void add(int p,int val) ;head[p]=cnt;}

int query(int x)

}hash;

正反雜湊字首和即可求出區間雜湊值,然後查詢起點到回文中心的正雜湊和回文中心到終點的反雜湊即可

例:一棵無根樹的本質不同的獨立集個數(\(k\)棵相同子樹方案為\(x\)則乘乙個可重組合)

【模板】kmp字串匹配

用於兩串匹配問題,做法是對子串求next後匹配母串,複雜度\(o(n+m)\)

const int n=1e6+10;

char s1[n],s2[n];

int nxt[n];

int main()

for(int i=1,j=0;i<=l1;i++)

for(int i=1;i<=l2;i++) printf("%d ",nxt[i]);

return puts(""),0;

}

工藝

\(o(n)\)求乙個環從某點斷開按一定方向形成的字典序最小的鏈

int i,j=2,k,l,p,s[610000];

int main()

s[i+k]【模板】manacher演算法

求出以每個位置為中心的最長回文串,複雜度\(o(n)\),證明:每次操作要麼不動\(while\),要麼給兩個單調的指標至少\(+1\)

const int n=3e7+10;

char s[n],t[n];

int l,p[n],r,c,ans;

int main()

cout<【模板】ac自動機(加強版)

用於處理多串匹配單串等多串問題,複雜度\(o(n*26)\)

方式是先建\(trie\),求出\(fail\)指標後建成\(trie\)圖

int n,node,fail[n],ch[n][26];

queueq;

void insert(char *s,int id)

}void get_fail()

}

【模板】字尾排序

用於處理字串字尾的東西(不過這東西noip不會考,省選題倒是經常出現)

複雜度\(o(nlogn)\),基於一種倍增和桶排的思想對字尾排序

const int n=1e6+10;

int m=300,t[n],x[n],y[n],rk[n],h[n],sa[n],l;char s[n];

int cmp(int i,int j,int k)

void sort()

void get_sa()

for(int i=1;i<=l;i++) rk[sa[i]]=i;

for(int i=1,j=0;i<=l;i++)

}int main()

【模板】字尾自動機

用於處理子串的問題。這傢伙比sa好寫複雜度還優秀適用範圍還廣些

不過noip還是不會考,複雜度\(o(n)\)

const int n=2e6+10;

int l,lst=1,node=1,t[n],a[n],len[n],fa[n];

int ch[n][26],siz[n];char s[n];

void extend(int c)

int x=ch[f][c],y=++node;

if(len[f]+1==len[x])

len[y]=len[f]+1;fa[y]=fa[x];fa[x]=fa[p]=y;

memcpy(ch[y],ch[x],sizeof(ch[y]));

while(f&&ch[f][c]==x) ch[f][c]=y,f=fa[f];

}int main()

Noip前的大抱佛腳 奇技淫巧

set查詢前驅後繼multiset iterator iter s.insert x iter s.find x 返回迭代器 iter 前驅 int ans iter s.erase find x return ans 或者可以使用 lower bound 大於等於 upper bound 嚴格大於...

字串 前 L的含義

一 在字串前加乙個 l作用 unicode字符集是兩個位元組組成的。l告示編譯器使用兩個位元組的 unicode 字符集。如 l 我的字串 表示將 ansi字串轉換成unicode 的字串,就是每個字元占用兩個位元組。strlen asd 3 strlen l asd 6 二 t 巨集可以把乙個引號...

字串 前 L的含義

一 在字串前加乙個 l作用 unicode字符集是兩個位元組組成的。l告示編譯器使用兩個位元組的 unicode 字符集。如 l 我的字串 表示將 ansi字串轉換成unicode 的字串,就是每個字元占用兩個位元組。strlen asd 3 strlen l asd 6 二 t 巨集可以把乙個引號...