首页 > 其他分享 >Acwing.第126场周赛

Acwing.第126场周赛

时间:2023-10-28 13:00:11浏览次数:48  
标签:周赛 string int long 126 VOS 字符串 include Acwing

Acwing.第126场周赛

比赛链接
之前忘记整理上传了,不能有遗留问题

A.蜗牛爬井

蜗牛在 n米深的井底往上爬,每天清晨到傍晚向上爬 5米,夜间又滑下来 4米,请问像这样从某天清晨开始,第几天爬到井口?
输入格式
一个正整数 n。
输出格式
一个整数,表示爬到井口的天数。

思路:

就是一个比较简答的模拟,我们对这个过程进行一个比较简单的模拟就好了

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
    int n;
    int ans=0;
    int x=0;
    cin>>n;
    while(true){
        x+=5;
        ans++;
        
        if(x>=n){
            break;
        }
        x-=4;

    }
    cout<<ans<<endl;

}
int main(){
    int t=1;
    while(t--){
        solve();
    }
    return 0;

}

B.替换字符

给定一个长度为 n的字符串 s和一个长度为 m的字符串 t。
字符串 s和 t均由小写字母组成,字符串 s的长度不超过字符串 t的长度。
我们希望字符串 s成为字符串 t 的子串。为此,你可以进行任意次(也可以不进行)字符替换操作。
每次操作可以任选字符串 s中的一个字符并将其替换为 ?。
? 可以视为等于任何其它字符。
请你计算,为了使得字符串 s成为字符串 t的子串,所需进行的最少操作次数,并提供一种具体操作方案。
例如,如果 s为 abd,t为 abcd,那么我们可以进行一次操作,将 s中的第 3个字符替换为 ?,替换后 s变为 ab?,可以与字符串 t 的子串 abc 匹配。
输入格式
第一行包含两个整数 n,m。
第二行包含一个长度为 n 的由小写字母构成的字符串 s。
第三行包含一个长度为 m 的由小写字母构成的字符串 t。
输出格式
首先,输出一行,一个整数 k,表示所需的最少操作次数。
如果 k=0,则输出到此为止,不要输出多余空行。
如果 k≠0,则还需再输出一行 k 个整数,其中第 i 个整数表示第 i 个操作所替换字符的位置编号。s 中字符的位置从左到右依次编号为 1∼n。
如果方案不唯一,输出任意合理方案均可。

思路:

根据原题给的数据范围,我们发现其实模拟是可以解决这个问题的,所以我们可以想着用模拟来解决这个问题,这里我没有给出数据范围,大家可以去上面链接自行查看

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N];
void solve(){
	int n,m;
	cin>>n>>m;
	string s1,s2;
	cin>>s1>>s2;
	std::vector<int> v;
	if(s2.find(s1)!=-1){
		cout<<0<<endl;
		return ;
	}
	int k=0x3f3f3f3f;
	for(int i=0;i<=m-n;i++){
		string s3="";
		int ans=0;

		for(int j=0;j<n;j++){
			if(s1[j]!=s2[j+i]){
				ans++;
			}	
		}
		k=min(k,ans);
	}
	cout<<k<<endl;
	for(int i=0;i<=m-n;i++){
		string s3="";
		int ans=0;

		for(int j=0;j<n;j++){
			if(s1[j]!=s2[j+i]){
				ans++;
			}	
		}
		if(ans==k){
			for(int j=0;j<n;j++){
				if(s1[j]!=s2[j+i]){
					cout<<j+1<<" ";
				}
			}
			break;
			
		}
	}
	cout<<endl;
	return ;	
}
int main(){
	int t=1;
	while(t--){
		solve();
	}
	return 0;
}

扩展字符串

题目链接
这个题面大家还是去看看原题吧

思路:

这个题当时我没有做出来,因为写了一半发现自己的概率论作业没有写呢,赛后看题解发现是一个比较简单的递归题

代码:

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int N = 1e5 + 5, MAXN = 1e18 + 1;
int siz[N];

string s1 = "DKER EPH VOS GOLNJ ER RKH HNG OI RKH UOPMGB CPH VOS FSQVB DLMM VOS QETH SQB";
string s2 = "DKER EPH VOS GOLNJ UKLMH QHNGLNJ A";
string s3 = "AB CPH VOS FSQVB DLMM VOS QHNG A";
string s4 = "AB";

char dfs(int n, int k) {
    if (n == 0)
        return s1[k - 1];
    if (k <= (int)s2.size())
        return s2[k - 1];
    else if (k <= (int)s2.size() + siz[n - 1])
        return dfs(n - 1, k - s2.size());
    else if (k <= (int)s2.size() + siz[n - 1] + s3.size())
        return s3[k - s2.size() - siz[n - 1] - 1];
    else if (k <= (int)s2.size() + siz[n - 1] + s3.size() + siz[n - 1])
        return dfs(n - 1, k - s2.size() - siz[n - 1] - s3.size());
    return s4[k - s2.size() - siz[n - 1] - s3.size() - siz[n - 1] - 1];
}

signed main(void) {
    int t;
    cin >> t;
    siz[0] = s1.size();
    for (int i = 1; i < N; i++) {
        int now = siz[i - 1] * 2 + s2.size() + s3.size() + s4.size();
        siz[i] = min(MAXN, now);
    }

    while (t--) {
        int n, k;
        cin >> n >> k;
        if (siz[n] < k) {
            cout << ".";
            continue;
        }
        cout << dfs(n, k);
    }
    return 0;
}

代码2:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 100010;
const LL INF = 2e18;

LL len[N];
string s = "DKER EPH VOS GOLNJ ER RKH HNG OI RKH UOPMGB CPH VOS FSQVB DLMM VOS QETH SQB";
string a = "DKER EPH VOS GOLNJ UKLMH QHNGLNJ A";
string b = "AB CPH VOS FSQVB DLMM VOS QHNG A";
string c = "AB";

char f(int n, LL k)
{
    if (k > len[n]) return '.';
    if (n == 0) return s[k - 1];

    if (k <= a.size()) return a[k - 1];
    k -= a.size();
    if (k <= len[n - 1]) return f(n - 1, k);
    k -= len[n - 1];
    if (k <= b.size()) return b[k - 1];
    k -= b.size();
    if (k <= len[n - 1]) return f(n - 1, k);
    k -= len[n - 1];
    return c[k - 1];
}

int main()
{
    len[0] = s.size();
    for (int i = 1; i < N; i ++ )
    {
        len[i] = len[i - 1] * 2 + a.size() + b.size() + c.size();
        len[i] = min(len[i], INF);
    }

    int Q;
    scanf("%d", &Q);
    while (Q -- )
    {
        int n;
        LL k;
        cin >> n >> k;
        cout << f(n, k);
    }

    return 0;
}

标签:周赛,string,int,long,126,VOS,字符串,include,Acwing
From: https://www.cnblogs.com/du463/p/17793995.html

相关文章

  • acwing367证明
    首先,\(max(p,q)\)是下界,因为连一条边最多只能减少一个零入度点和一个零出度点,而最终的图不可能有哪怕一个零出度点或者零入度点(最后的图刚好就是一个点)根据这个下界,我们也很容易可以构造出来一种方法,让零出度点和另一个SCC的零入度点相连即可,就像下面一样(红色边是添加的边)......
  • Acwing393. 雇佣收银员 题解 差分约束
    题目链接:https://www.acwing.com/problem/content/description/395/解题思路:差分约束。为了方便起见,定义第\(i\)个时间段为\(i-1:00\)到\(i:00\)首先,为了方便开一个额外的点,令\(R_i\)对应为题目中的\(R(i+1)\),即\(R_i\)表示\(i-1:00\)到\(i:00\)这个时间段的最小需求......
  • acwing318 划分大理石
    有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现。其中大理石的总数不超过20000。输入格式输入包含多组数据!每组数据占一行,包含6个整数,表示a[1]∼a[6]。当输入为000000时表示输入结束,且该行无需考虑。输出......
  • [UVA12683] Odd and Even Zeroes
    Description给出\(n\),求出\(0!,1!,2!\ldots,n!\)中有几个末尾有偶数个\(0\)。\(1\len\le10^{18}\)。Solution根据基本结论,一个数末尾\(0\)的个数等于该数有几个因数\(5\)。而一个数的阶乘末尾有几个\(0\),等于小于等于该数的所有数的因数\(5\)的个数的和。对此......
  • ARC126C - Maximize GCD(取模转化减法)
    答案大于max{ai}可以直接计算主要考虑小于的情况直接计算gcd很困难,不妨枚举x|gcd那么对于ai来说假设x(k-1)<ai<=xk,那么ai就需要xk-ai次操作,那么我们对于一个x,只需枚举k计算区间数的个数即可算出需要的操作数。复杂度O(nlnn)这种套路就是取模转化成减法后,进行区间维护。#......
  • 2023级HAUT新生周赛题解汇总
    2023级HAUT新生周赛(零)熟悉周赛规则专场:2023级HAUT新生周赛(一)@21级学长专场(张子豪,张鑫,李昊阳):2023级HAUT新生周赛(二)@曹瑞峰专场:2023级HAUT新生周赛(三)@22级学姐专场(杨焱,刘振歌,周欣滢):2023级HAUT新生周赛(四)@牛浩然专场:2023级HAUT新生周赛(五)@陈兰锴专场:......
  • AcWing 902. 最短编辑距离
    题目给定两个字符串$A$和$B$,现在要将$A$经过若干操作变为$B$,可进行的操作有:删除–将字符串$A$中的某个字符删除。插入–在字符串$A$的某个位置插入某个字符。替换–将字符串$A$中的某个字符替换为另一个字符。现在请你求出,将$A$变为$B$至少需要进行多少次操......
  • ☀️Navicat连接Oracle:'ORA-12638: Credential retrieval failed' 解决办法
    前言:我们在使用Navicat连接Oracle数据库的时候,需要oci.dll动态链接库,Navicat16在安装时候已经自带了。我在之前使用一直好好的,就今天需要连一个新项目的Oracle,报错了:ORA-12638:Credentialretrievalfailed',如下:解决:通过同事口中得知,要连接的Oracle版本是:12c(12.2.0.1.0),而我之前......
  • 对acwing355异象石引理的证明
    首先我们抽象一下这道题的模型,然后把引理记住模型:对于一棵树上选定的一些点,把他们连通起来的最小边数我们先考虑一种朴素做法,对于任何一种方案,任取其中两个点,那么这个方案一定包含这两个点之间的路径就是说,我们依次添加每个点,对于每一个新添加进来的点,让这个点与其已经添加的点......
  • Acwing 最长上升子序列
    题目给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000−10^9≤数列中的数≤10^9输入样例:73121856输出样例:4题解......