河南萌新联赛2024第(二)场:南阳理工学院
1.D-A*BBBB
原题链接:https://ac.nowcoder.com/acm/contest/87255/D
根据乘法的原理,且b的每一位都相同,最终答案则是错位相加得出的结果,于是我们将a翻转,从个位开始计算,如果当前位置小于a.size就往前累加,但如果大于或等于b.size就从头开始一个一个的减(这个过程可以通过纸上手写乘法计算得到),最终翻转字串就是答案
查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
//int dp[3010][3010];
signed main()
{
int t;
cin>>t;
while(t--)
{
string a,b,c;
cin>>a>>b;
reverse(a.begin(),a.end());
int ans=0,res=0;
for(int i=0;i<a.size()+b.size();i++)
{
if(i<a.size())
{
ans+=a[i]-'0';
}
if(i>=b.size())
{
ans-=a[i-b.size()]-'0';
}
res+=ans*(b[0]-'0');
c.push_back(res%10+'0');
res/=10;
}
while(c.size()>1&&c.back()=='0')c.pop_back();
reverse(c.begin(),c.end());
cout<<c;
cout<<endl;
}
return 0;
}
2.E-“好”字符
原题链接:https://ac.nowcoder.com/acm/contest/87255/E
查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int f[1000000];
signed main() {
int n;
string a,b;
cin>>n>>a>>b;
int ans=0;
for(int k=0;k<26;k++)
{
string s1=a,s2=b;
int x=0,y=0;
for(int j=0;j<n;j++)
{
if(s1[j]!='a'+k)s1[j]='#';
else x++;
if(s2[j]!='a'+k)s2[j]='#';
else y++;
}
if(x==0||y==0||x!=y)continue;
s2+=s2;
s1=" "+s1,s2=" "+s2;
f[1]=0;
for(int i=2,j=0;i<=n;i++)
{
while(j&&s1[i]!=s1[j+1])j=f[j];
if(s1[i]==s1[j+1])j++;
f[i]=j;
}
for(int i=1,j=0;i<=2*n;i++)
{
while(j&&s2[i]!=s1[j+1])j=f[j];
if(s2[i]==s1[j+1])j++;
if(j==n)
{
ans++;
break;
}
}
}
cout<<ans;
return 0;
}