“新智認知”杯上海高校程序設計競賽暨第十七屆上海大學程序設計春季聯賽題解

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 的神奇序列
找規律
v[i]=v[i1](i21) v[i] = v[i-1]*(i*2-1)%mod;
乘以一個每次大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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章