河南萌新联赛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;
}
posted @ 2024-07-25 19:16  伊芙加登  阅读(16)  评论(0编辑  收藏  举报