2024.4.6练习笔记

浙江理工大学 2024 年程序设计竞赛(同步赛)

F leetcode

题目要求:求出一个序列中对于每个位置 \(i\) ,以 \(i\) 为起点第一个\(\text{leetcode}\) 子序列的终止位置。需要注意的是不要求子序列连续。不存在则答案为零。

容易想到双指针,但是会 TLE,考虑一些优化。

扫描序列,字母是属于 \(\text{leetcode}\) 中的字母则将其位置记录进vector。此时保证vector数组中的数字是严格递增的。之后在每个位置向后搜索目标子序列每个字母是否存在一个位置在正在搜索的位置之后并且在子字符串上个搜索到的位置之后。

#include<bits/stdc++.h>
using namespace std;

string s;
string lc="leetcode";
map<char,vector<int>> mp;

int solve(int pos){
    for(int j=0;j<lc.size();j++){
        char c=lc[j];
        auto ans=lower_bound(mp[c].begin(),mp[c].end(),pos);
        if(ans==mp[c].end())
            return 0;
        pos=*ans+1;
    }
    return pos;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>s;
    for(int i=0;i<s.size();i++)
        if(lc.find(s[i])!=string::npos)
            mp[s[i]].push_back(i);
    for(int i=0;i<s.size();i++){
        int pos=i;
        cout<<solve(pos)<<" ";
    }
    return 0;
}

G 好想会数学啊

题目要求:求第一个大于 \(10^{30} + 50\) 的质数。

根据质数距离很小的原则,直接从 \(10^{30} + 50\) 逐步加即可。

优化:\(+2,+3,+4,+5,+6\) 均可手动判断不是质数。所以只要尝试输出 \(+1,+7\) 即可。

\(10^{30} + 50\) 采用 Miller-Rabin 判断质数。

最坏的情况可以在七次之后猜出正确答案。你心中的答案,我猜不出。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string s="1000000000000000000000000000057";
    cout<<s;
}

I 神说要有光

模拟就行

#include<bits/stdc++.h>
using namespace std;

const int N=1e4+7;
string s[N];
int n,q,op;

void Init(){
    for(int i=1;i<=n;i++)
        s[i].resize(n,'a');
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>q;
    Init();
    int a,c,d;
    char b;
    while(q--){
        cin>>op;
        switch(op) {
            case 1:
                cin >> a >> b ;
                s[a].erase();
                s[a].resize(n,b);
                break;
            case 2:
                cin >> a >> b ;
                for(int i=1;i<=n;i++)
                    s[i][a-1]=b;
                break;
            case 3:
                cin>>c>>b;
                for(int i=1;i<=n;i++)
                    for(int j=0;j<n;j++)
                        if((i+j+1)==c)
                            s[i][j]=b;
                break;
            case 4:
                cin>>d>>b;
                for(int i=1;i<=n;i++)
                    for(int j=0;j<n;j++)
                        if((i-j-1)==d)
                            s[i][j]=b;
                break;
            case 5:
                cin>>a;
                cout<<s[a]<<endl;
                break;
        }
    }
    return 0;
}

L 今天是个上分的好日子

模拟就行

#include<bits/stdc++.h>
using namespace std;

#define ll long long
ll ans,liansheng;
string a;
int s;

int main()
{
    cin>>a;
    for(int i=0;i<a.size();i++)
    {
        s=a[i]-'0';
//        cout<<s<<endl;
        if(s==1){
            liansheng++;
            ans+=3;
            if(liansheng>=2&&liansheng<=6)
                ans+=liansheng-1;
            else if(liansheng>6) ans+=5;
        }
        else{
            liansheng=0;
            ans-=12;
        }
    }
    cout<<ans<<endl;
    return 0;
}
posted @ 2024-04-06 19:34  Sure042  阅读(18)  评论(0编辑  收藏  举报