https://ac.nowcoder.com/acm/contest/551#question
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) == dict.end()) {
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;
class Solution
{
public:
string removeDuplicateLetters(string s) {
vector<int> vec(256,0);
vector<bool> visited(256,0);
for(char c : s)
vec[c]++;
string res = "";
for(char c : s){
vec[c]--;//每次遍歷一個字符就將他出現的次數減一
if(visited[c])//標記是否訪問過
continue;
while(vec[res.back()] && c < res.back()){
visited[res.back()] = false;
res.pop_back();
}
res += c;
visited[c] = true;
}
return res;
}
};
int main(){
Solution Solution1;
string s;
cin>>s;
cout<<Solution1.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,並sort
up(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;
{ //1
up(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 next
up(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 的神奇序列
找規律
乘以一個每次大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("%lld\n",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_JUDGE
freopen("Text.txt", "r", stdin);
#endif // LOCAL_JUDGE
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
RUN();
#ifdef LOCAL_JUDGE
fclose(stdin);
#endif // LOCAL_JUDGE
return 0;
}