ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

模板集合

2022-08-28 22:32:23  阅读:101  来源: 互联网

标签:return 查看 int res 代码 点击 集合 模板


建议用标题旁边打开的目录,更清晰明了!

太多了,编辑的时候要找好久,数据结构和图论都搬出去了,下面有链接。离数学搬家也不远了。

其他

读入、输出优化(必加!!!)

快读

模板
inline int read(){
	int sum=0,f=1;char a=getchar();
	while(a<'0' || a>'9'){if(a=='-') 	f=-1;a=getchar();}
	while(a>='0' && a<='9') 	sum=sum*10+a-'0',a=getchar();
	return sum*f;
}

快输

模板
void print(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) print(x/10);
	putchar(x%10+'0');
}

数据结构

图论

字符串

AC 自动机

模板指路

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define se second
#define fi first

const int N=2e6+5;
struct node{
	int end,fail,s[26];
};
node a[N];
int n,co;

void insert(string s){
	int u=0;
	for(int i=0;i<s.size();++i){
		if(!a[u].s[s[i]-'a'])	a[u].s[s[i]-'a']=++co;
		u=a[u].s[s[i]-'a'];
	}
	a[u].end++;
}
void get_fail(){
	queue<int> q;
	for(int i=0;i<26;++i)
		if(a[0].s[i])
			q.push(a[0].s[i]),a[a[0].s[i]].fail=0;
	while(q.size()){
		int x=q.front();q.pop();
		for(int i=0;i<26;++i){
			if(a[x].s[i])
				a[a[x].s[i]].fail=a[a[x].fail].s[i],
				q.push(a[x].s[i]);
			else	a[x].s[i]=a[a[x].fail].s[i];
		}
	}
}
int fi(string s){
	int res=0,u=0;
	for(int i=0;i<s.size();++i){
		u=a[u].s[s[i]-'a'];
		for(int j=u;j && a[j].end!=-1;j=a[j].fail)
			res+=a[j].end,a[j].end=-1;
	}
	return res;
}

int main(){
	
	cin>>n;
	for(int i=1;i<=n;++i){string s;cin>>s;insert(s);}
	get_fail();
	string s;cin>>s;
	printf("%d",fi(s));
	
	return 0;
}

数学

大小步(BSGS)

点击查看代码
int bsgs(int a,int b,int p){//(a^x)%p=b%p 
	map<int,int> ha;
	int t=sqrt(p)+1;
	for(int i=0,q=b%p;i<t;++i,q=q*a%p)	ha[q]=i;
	int w=ksm(a,t,p);
	for(int i=1,q=w;i<=t;++i,q=q*w%p)
		if(ha.find(q)!=ha.end())	return t*i-ha[q];
	return -1;
}

拓展欧几里得定理(exgcd)

点击查看代码
int exgcd(int a,int b,int &x,int &y){
	if(!b){x=1,y=0;return a;}
	int g=exgcd(b,a%b,x,y),t=x;
	x=y,y=t-a/b*y;
	return g;
}

中国剩余定理(CRT)

点击查看代码
int CRT(){
	int m=1,res=0,x,y;
	for(int i=1;i<=n;++i)	m*=a[i];
	for(int i=1;i<=n;++i){
		int tmp=m/a[i];
		exgcd(tmp,a[i],x,y);
		res=(res+tmp*x*b[i]%m)%m;
	}
	return (res%m+m)%m;
}

线性筛法求欧拉函数

点击查看代码
void init(int n){
	for(int i=2;i<=n;++i){
		if(!vi[i])	pr[++co]=i,phi[i]=i-1;
		for(int j=1;j<=co && i*pr[j]<=n;++j){
			vi[pr[j]*i]=1;
			if(i%pr[j]==0){
				phi[pr[j]*i]=phi[i]*pr[j];
				break;
			}
			else	phi[i*pr[j]]=phi[i]*(pr[j]-1);
		}
	} 
}

基础算法

快速幂

点击查看代码
int ksm(int x,int y){
	int res=1;
	while(y){
		if(y&1)	res=(res*x)%p;
		y>>=1,x=(x*x)%p;
	}
	return res%p;
}

标签:return,查看,int,res,代码,点击,集合,模板
来源: https://www.cnblogs.com/yolanda-yxr/p/16448721.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有