乙组解题报告
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