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 巨集可以把乙個引號...