一些模板
Posted warmingtxdy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些模板相关的知识,希望对你有一定的参考价值。
string 操作:
1 =,assign() //赋以新值 2 s.assign(str); 3 s.assign(str,1,3);//如果str是”iamangel” 就是把”ama”赋给字符串 4 s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给s 5 s.assign(“gaint”); 6 s.assign(“nico”,5);//把’n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串 7 s.assign(5,’x’);//把五个x赋给字符串 8 b) swap() //交换两个字符串的内容 9 c) +=,append(),push_back() //在尾部添加字符 10 d) insert() //插入字符 11 e) erase() //删除字符 12 g) replace() //替换字符 13 h) +//串联字符串 14 ==,!=,<,<=,>,>=,compare() //比较字符串 15 string s(“abcd”); 16 s.compare(“abcd”); //返回0 17 s.compare(“dcba”); //返回一个小于0的值 18 s.compare(“ab”); //返回大于0的值 19 s.compare(s); //相等 20 s.compare(0,2,s,2,2); //用”ab”和”cd”进行比较 小于零 21 s.compare(1,2,”bcx”,2); //用”bc”和”bc”比较。 22 j) size(),length() //返回字符数量 23 r) copy() //将某值赋值为一个C_string 24 s) c_str() //将内容以C_string返回 25 u) substr() //返回某个子字符串 26 s.substr(11);//从索引11往后的子串 27 s.substr(5,6);//从索引5开始6个字符 28 k)find() 29 string::size_type position; 30 position = s.find("xx"); 31 //查找s 中flag 出现的所有位置。 32 flag="a"; 33 position=0; 34 while((position=s.find_first_of(flag,position))!=string::npos) 35 36 //position=s.find_first_of(flag,position); 37 cout<<"position : "<<position<<endl; 38 position++; 39
GCD :
int gcd(int x,int y) return y?gcd(y,x%y):x;
LCM :
int lcm(int a,int b) return a*b/gcd(a,b);
扩展欧几里得 :
1 int exgcd(int a, int b, int& x, int& y)//a*x+b*y=gcd(a,b)=d;(x,y)为其一组整数解 2 int d = a; 3 if(b != 0) 4 d = exgcd(b, a % b, y, x); 5 y -= (a / b) * x; 6 else 7 x = 1; 8 y = 0; 9 10 return d; 11
快速幂 :
1 ll quick_power(ll base, ll n) 2 ll res = 1; 3 while (n > 0) 4 if (n & 1) 5 res *= base; // res = (res * base) % mod; 6 base *= base; //base = (base * base) % mod; 7 n >>= 1; 8 9 return res; 10
矩阵快速幂 :
1 int mod; 2 int n,m,sum; 3 struct mtix 4 int a[maxn][maxn]; 5 mtix()memset(a,0,sizeof(a)); 6 f; 7 mtix mul(mtix a,mtix b) 8 mtix c; 9 for (int i=1;i<=n;i++) 10 for (int j=1;j<=n;j++) 11 for (int k=1;k<=n;k++) 12 c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;c.a[i][j]%=mod; 13 return c; 14 15 mtix mpow(int y) 16 mtix ans; 17 mtix tem=f; 18 for (int i=1;i<=n;i++) 19 ans.a[i][i]=1; 20 for (;y;tem=mul(tem,tem),y>>=1) 21 if (y&1) ans=mul(ans,tem); 22 for (int i=1;i<=n;i++) 23 sum+=ans.a[i][i]; 24 cout<<sum%mod<<endl; 25 return ans; 26 27 int main() 28 cin>>n>>m; 29 for (int i=1;i<=n;i++) 30 for (int k=1;k<=n;k++) 31 cin>>f.a[i][k]; 32 mpow(m); 33
最长公共子序列LCS :
1 char a[1010],b[1010]; 2 int dp[1010][1010]; 3 int main() 4 int lena,lenb,i,j; 5 while(scanf("%s%s",&a,&b)!=EOF) 6 lena=strlen(a); 7 lenb=strlen(b); 8 memset(dp,0,sizeof(dp)); 9 for(i=1;i<=lena;++i) 10 for(j=1;j<=lenb;++j) 11 if(a[i-1]==b[j-1]) 12 dp[i][j]=dp[i-1][j-1]+1; 13 else 14 dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 15 16 17 printf("%d\n",dp[lena][lenb]); 18 19 return 0; 20
最短路Floyd :
1 for (int k = 1; k <= n; k++) 2 for (int i = 1; i <= n; i++) 3 if (i == k) continue; 4 for (int j = 1; j <= n; j++) 5 if (i == j || k == j) continue; 6 dis[i][j] = min(dis[i][j], dis[i][k]+ dis[k][j]); 7 8 9
并查集 :
1 int pre[maxn]; 2 int tot[maxn];//集合元素数量 3 int Rank[maxn];//集合排名 4 int n,m,k; 5 void init() 6 for(int i=1;i<=n;++i) 7 pre[i]=i; 8 tot[i]=1; 9 10 mst(Rank,0); 11 12 int find(int x) 13 if(x==pre[x]) 14 return x; 15 else 16 return pre[x]=find(pre[x]); 17 18 19 void join(int x, int y) 20 x = find(x); 21 y = find(y); 22 if (Rank[x] > Rank[y]) 23 pre[y] = x; 24 if (x != y) 25 tot[x] += tot[y]; 26 27 else 28 pre[x] = y; 29 if (x != y) 30 tot[y] += tot[x]; 31 if (Rank[x] == Rank[y]) 32 Rank[y] += 1; 33 34
SG 打表 :
1 //f[]:可以取走的石子个数 2 //sg[]:0~n的SG函数值 3 //vis[]:mex 4 int f[maxn],sg[maxn],vis[maxn]; 5 void getSG(int n) 6 int i,j; 7 memset(sg,0,sizeof(sg)); 8 for(i=1;i<=n;i++) 9 memset(vis,0,sizeof(vis)); 10 for(j=1;f[j]<=i&&f[j]<=m;j++) //注意加f[i]的限定条件,此处为f[j]<=m 11 vis[sg[i-f[j]]]=1; 12 for(j=0;j<=n;j++) //求mes中未出现的最小的非负整数 13 if(vis[j]==0) 14 sg[i]=j; 15 break; 16 17 18 //cout<<i<<" "<<sg[i]<<endl; 19 20
SG_DFS :
1 //注意 S数组要按从小到大排序 SG函数要初始化为-1 对于每个集合只需初始化1遍 2 //n是集合s的大小 S[i]是定义的特殊取法规则的数组 3 int s[110],sg[10010],n; 4 int SG_dfs(int x) 5 6 int i; 7 if(sg[x]!=-1) 8 return sg[x]; 9 bool vis[110]; 10 memset(vis,0,sizeof(vis)); 11 for(i=0;i<n;i++) 12 13 if(x>=s[i]) 14 15 SG_dfs(x-s[i]); 16 vis[sg[x-s[i]]]=1; 17 18 19 int e; 20 for(i=0;;i++) 21 if(!vis[i]) 22 23 e=i; 24 break; 25 26 return sg[x]=e; 27
以上是关于一些模板的主要内容,如果未能解决你的问题,请参考以下文章