B CSL 的英语考试
根据映射改一下单词,然后还是直接比较字典序
#include <iostream>
#include <map>
#include <stdio.h>
using namespace std;int main()
{map<char,char> m1;int n;cin>>n;for(int j=0;j<26;j++){char c;cin>>c;m1[c]='a'+j;}for(int k=0;k<n;k++){string a ,b;cin>>a;cin>>b;for(int i=0;i<a.size();i++){a[i] = m1[a[i]];}for(int i=0;i<b.size();i++){b[i]=m1[b[i]];}if(a<b){cout<< "<" <<endl;}else if(a>b){cout<<">"<<endl;}else{cout<<"="<<endl;}}return 0;
}
C CSL 的密码
总数减去重复出现的个数
题目有随机生成的字样,就是说长度很长的时候认为不可能有重复出现的可能
这样减少循环次数,否则会超时
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, sum = 0;
set<string> dict;
string s;
int main()
{cin >> n >> m >> s;long long lap = 0, ans = (n - m + 1) * (n - m + 2) / 2;for (int i = m; i <= min((int)s.size(), 8); i++) {for (int j = 0; j <= s.size() - i; j++) {string t(s.begin() + j, s.begin() + j + i);if (dict.find(t) == d()) {dict.insert(t);} else {lap++;}}
// sum += dict.size();dict.clear();}printf("%lld", ans - lap);return 0;
}
CSL 的字符串
类似与计算器,字母一个个压栈:
当前字符字典序 > 栈顶元素字典序 且前面没有出现过可以直接压进去
当前字符字典序 < 栈顶元素字典序 且后面还有改栈顶元素出现,弹栈 直到不满足条件将该元素压栈
需要统计各个字符出现的数量以及栈内是否有改字符 分别用两个数组来统计
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>
#include <iomanip>
#include <cstdlib>
#include <ctime>using namespace std;
#define debug(x) cout<<#x<<": "<<x<<endl;string removeDuplicateLetters(string s){int cnt[256]={0};bool visit[256]={0};string ret = "";for(int i=0;i<s.size();i++){cnt[s[i]]++;}for(int i=0;i<s.size();i++){cnt[s[i]]--;if(visit[s[i]]){continue;}if( s[i] > ret.back()){ret.push_back(s[i]);visit[s[i]] = true;}else{while(s[i]<ret.back() && cnt[ret.back()]>0){visit[ret.back()] = false;ret.pop_back();}ret.push_back(s[i]);visit[s[i]] = true;}}return ret;
}int main(){string s;cin>>s;cout<<removeDuplicateLetters(s)<<endl;return 0;
}
E CSL 的魔法
正序序列对应逆序序列,只要达到这种对应即可 不需要将两个序列都排成有序之后求交换次数
离散化数组,然后并查集找环
//.CSL的魔法
//数组之间的大数对小数,小数对大数
#include<bits/stdc++.h>
using namespace std;
#define maxn (int)1e5+1000
#define up(i,x,y) for(int i=x;i<=y;i++)
#define down(i,x,y) for(int i=x;i>=y;i--)
#define deg(x) { cerr<<#x<<": "<<x<< ' '; }
typedef long long ll;
int a[maxn],b[maxn]; //两个数组
struct node
{int x;int id;
}t_a[maxn],t_b[maxn]; a,b的大小映射index
bool cmp(node a,node b)
{return a.x<b.x;
}
int fa[maxn]; //并查集维护
int findd(int x)
{if(x==fa[x])return fa[x];return fa[x]=findd(fa[x]);
}
void unionn(int x,int y)
{int a=findd(x),b=findd(y);if(a!=b)fa[a]=b;
}
void compress(int x[],int n) //离散化数组
{vector<int>xs;up(i,1,n)xs.push_back(x[i]);sort(xs.begin(),xs.end());xs.erase(unique(xs.begin(),xs.end()),xs.end());//舍去xs中重复的part,并sortup(i,1,n)x[i]=lower_bound(xs.begin(),xs.end(),x[i])-xs.begin()+1;
}
#define INF (int)1e9
int main()
{int n;scanf("%d",&n);up(i,1,n)scanf("%d",&a[i]);up(i,1,n)scanf("%d",&b[i]);离散化compress(a,n);compress(b,n);//up(i,1,n)cout<<b[i]<<endl;////up(i,1,n)cout<<a[i]<<' ';cout<<endl;//up(i,1,n)cout<<b[i]<<' ';cout<<endl;up(i,1,n)t_a[i].x=a[i],t_a[i].id=i;sort(t_a+1,t_a+1+n,cmp);up(i,1,n)t_b[i].x=b[i],t_b[i].id=i;sort(t_b+1,t_b+1+n,cmp);int ans=INF;{ //1up(i,1,n)fa[i]=i;up(i,1,n) //for a{int x=a[i];int t_id=t_b[(n+1-x)].id;unionn(x,a[t_id]);}int sum=0;up(i,1,n)if(fa[i]==i)sum++;ans=min(ans,n-sum);}/*{ //2 nextup(i,1,n)fa[i]=i;up(i,1,n) //for a{int x=b[i];int t_id=t_a[(n+1-x)].id;unionn(x,b[t_id]);}int sum=0;up(i,1,n)if(fa[i]==i)sum++;ans=min(ans,n-sum);}*/cout<<ans<<endl;
}
F CSL 的神奇序列
找规律
v [ i ] = v [ i − 1 ] ∗ ( i ∗ 2 − 1 ) v[i] = v[i-1]*(i*2-1)%mod; v[i]=v[i−1]∗(i∗2−1)
乘以一个每次大2的奇数
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
ll v[1000005];
int main()
{ll w,q;cin>>w>>q;v[0] = v[1] = 1;for(int i = 2;i <= 1000000;i++) v[i] = v[i-1]*(i*2-1)%mod;int n;while(q--){scanf("%d",&n);printf("%lldn",v[n]*w%mod);}return 0;
}
F CSL 的神奇序列
文件输入输出?
#include<bits/stdc++.h>using namespace std;typedef long long ll;const double eps = 1e-8;
const ll MOD = 998244353;
const int INF = 0x3f3f3f3f;
const int maxn = 1e6 + 10;int n;
ll w, q;
ll arr[maxn];void RUN()
{while (cin >> w >> q){arr[1] = w;for (int i = 2; i < maxn; ++i) arr[i] = ((i - 1) << 1 | 1) * arr[i - 1] % MOD;while (q--){cin >> n;cout << arr[n] << "n";}}
}int main()
{
#ifdef LOCAL_JUDGEfreopen(", "r", stdin);
#endif // LOCAL_JUDGEios::sync_with_stdio(false);cin.tie(0), cout.tie(0);RUN();#ifdef LOCAL_JUDGEfclose(stdin);
#endif // LOCAL_JUDGEreturn 0;
}
本文发布于:2024-01-30 14:00:28,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170659443020507.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |