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) 指数部分是所有参与运算的其他数的乘积。
阅读全文