上海12月月赛乙组解题报告

上海12月月赛乙组解题报告
摘要由CSDN通过智能技术生成

乙组解题报告

1. 拼接单词

在这里插入图片描述

在这里插入图片描述

暴力枚举,用map标记60分(代码略)

AC:哈希数组统计

我们首先来观察一下什么时候会出现重复:
比如第一个样例s1=ab和s2=ba,因为两个字符串都要出一个数字,所以当s1出一个字母a时是没有重复的,当s1出两个字母时,因为s1中有一个b而s2中也有一个b,所以aba与aba会发生重复。
那么我们可以得到,当s1的字母与s2中的字母有重复时,那么选择s[i]前面的与相对应的后半部分(包含这个字母)和s[i]前面的(包含s[i])与相对应的后半部分会发生重复。
所以用vh统计一下s2中的字母个数,遍历s1时减去vh[s[i]]即可。

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

string a,b;
ll vh[30];

int main(){
   
	cin >> a >> b;
	ll len1=a.size(),len2=b.size();
	ll ans=len1*len2;
	for(int i=0;i<len2-1;++i)
		vh[b[i]-'a']++;
	for(int i=1;i<len1;++i)
		ans-=vh[a[i]-'a'];
	cout << ans << endl;
	return 0;
}

2.八进制小数

在这里插入图片描述
在这里插入图片描述

高精度模拟

我们将乘八分之一转化为乘0.125,维护时只维护小数部分,即每次都将a数组乘上对应数量的125(可以维护一个小数点,修改数组a[0]就相当于添加前面的0了),再累加到一个b数组上(注意先要对齐每一位再加)。

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

string s; 
int a[4010],b[4010];

void minuss(int a[],int b,int pot){
   
	int l=a[0],g=0;
	for(int i=1;i<=l;++i){
   
		int m=a[i]*b+g;
		a[i]=m%10;
		g=m/10;
	}
	while(g>0){
   
		l++;
		a[l]=g%10;
		g/=10;
	}
	while(l>1 && a[l]==0)
	  l--;
	a[0]=l;
	if(a[0]>pot){
   
		for(int i=pot+1;i<=a[0];++i)
		   a[i]=0;
		a[0]=pot;
	}
	if(a[0]<pot)
		a[0]=pot;
}

void print(int c[]){
   
	int l=1;
	while(l<c[0] && c[l]==0)
	     l++;
	int ll=c[0];
	while(ll>1 && c[ll]==0)
	  ll--;
	c[0]=ll;
	for(int i=c[0];i>=l;--i)
	   cout << c[i];
}

void addbign(int b[],int a[]){
   
	if(a[0]<=b[0]){
   
		int r=b[0]-a[0];
		for(int i=a[0];i>=1;--i)
			a[i+r]=a[i];
		for(int i=1;i<=r;++i)
		    a[i]=0;
		a[0]=b[0];
	}
	else{
   
		int r=a[0]-b[0];
		for(int i=b[0];i>=1;--i)
			b[i+r]=b[i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值