快速幂
int power(int a,int b,int p){
int ans=1%p;
for(;b;b>>=1){
if(b&1)ans=(long long)ans*a%p;
a=(long long)a*a%p;
}
return ans;
}
快速乘
long long mul(long long a,long long b,long long p){
long long ans=0;
for(;b;b>>=1){
if(b&1)ans=(ans+a)%p;
a=a*2%p;
}
return ans;
}
ST表
void ST_prework(){
for(int i=1;i<=n;i++)f[i][0]=a[i];
int t=log(n)/log(2)+1;
for(int j=1;j<t;j++)
for(int i=1;i<=n-(1<<j)+1;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
int ST_query(int l,int r){
int k=log(r-l+1)/log(2);
return max(f[l][k],f[r-(1<<k)+1][k]);
}
KMP
nxt[1]=0;
for(int i=2,j=0;i<=n;i++){
while(j>0&&a[i]!=a[j+1])j=nxt[j];
if(a[i]==a[j+1])j++;
nxt[i]=j;
}
for(int i=1,j=0;i<=m;i++){
while(j>0&&(j==n||b[i]!=a[i+1]))j=nxt[j];
if(b[i]==a[j+1])j++;
f[i]=j;
}
最小表示法
int n=strlen(s+1);
for(int i=1;i<=n;i++)s[n+i]=s[i];
int i=1,j=2,k;
while(i<=n&&j<=n){
for(k=0;k<n&&s[i+k]==s[j+k];k++);
if(k==n)break;
if(s[i+k]>s[j+k]){
i=i+k+1;
if(i==j)i++;
}else{
j=j+k+1;
if(i==j)j++;
}
}
ans=min(i,j);
Trie
int trie[SIZE][26],tot=1;
void insert(char *str){
int len=strlen(str),p=1;
for(int k=0;k<len;k++){
int ch=str[k]-'a';
if(trie[p][ch]==0)trie[p][ch]=++tot;
p=trie[p][ch];
}
end[p]=true;
}
bool search(char* str){
int len=strlen(str),p=1;
for(int k=0;k<len;k++){
p=trie[p][str[k]-'a'];
if(p==0)return false;
}
return end[p];
}
标签:nxt,return,int,long,++,算法,ans,模板
From: https://www.cnblogs.com/playtime00/p/17656857.html