C语言算法训练第十二天,如何为?
摘要:C++算法算法训练第十二天 以下为牛客挑战 今日收获 知道了小根堆的写法 priority_queue<int,vector<int>,g
C++算法算法训练第十二天
以下为牛客挑战
今日收获
知道了小根堆的写法
priority_queue<int,vector<int>,greater<int>>q;
用于小根堆,每次直接用top()取,得到里面最小的。
问图中有多少个连续的子集
0001100
我们只需要取判断,s[i]!=s[i+1]的个数就行了。我们可以看到一共有3个。
费马小定理求逆元。
ksm(2,mod-2,mod)---》2的-1次方。
组合数学
for(int i=2;i<=n;i++){
f[i]=f[i-1]*i%mod;//表示阶乘
g[i]=g[i-1]*ksm(i,mod-2,mod)%mod;//阶乘的倒数
}
牛客小白月赛128
模糊匹配
4
9
Apple0123
Apple0123
5
AKIOI
AK101
10
ilovezaoly
1loveza0Iy
6
banana
BANANA
YES
YES
NO
NO
解题代码
#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
void solve(){
int n;
cin>>n;
string s,s1;
cin>>s>>s1;
for(int i=0;i<n;i++){
if(s[i]=='O'){
s[i]='0';
}
if(s1[i]=='O'){
s1[i]='0';
}
if(s[i]=='I'||s[i]=='l'){
s[i]='1';
}
if(s1[i]=='I'||s1[i]=='l'){
s1[i]='1';
}
}
if(s==s1){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
};
};
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
TESTS{
solve();
};
return 0;
}
只留专一数
2
2
8 15
1
6
YES
NO
实际上我们通过观察,当选择一个数的时候
选两个不同的位置 i, j
令 a[i] = a[i] ^ a[j](a[i] 的 a[j] 次方)
令 a[j] = a[n'](用最后一个元素覆盖)
n' 减1(相当于数组长度-1,丢弃最后一个元素)
那么我们当到达最后一个的时候到底是什么一个情况
实际上最后会变成
a1^(a2*a3*a4*a5*a6*....ak)
指数部分是所有参与运算的其他数的乘积。
