• 前言:由于本蒟蒻弱,只能写出签到题,因此这篇题解都是一些简单题(A题,B题和D题),要是在找一些难题的题解的大佬们,见谅了,这是三道简单题的题解,还有这些题解要是有说不清的地方,请见谅,随时欢迎不懂的同学私信我。
  1. A题
    如题所说,就是一道签到题,ai的数据也就是1e9,因此不会map的,也可以使用数组。
    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=100000+100;
    map<ll,int> cnt;
    ll a[N];
    int n,m;
    int main()
    {
     scanf("%d",&n);
     for(int i=1;i<=n;i++)
     {
         ll x;
         scanf("%lld",&x);
         if(cnt[x]==0)
             a[++m]=x;
         cnt[x]++;
     }
    
     ll ans=0;
     for(int i=1;i<=m;i++)
         ans=max(ans,(ll)(cnt[a[i]]*a[i]));
     cout<<ans<<endl;
     return 0;
    }

2.B题
找规律题,可以发现10以内糖果数是17,每100都要加上9,要是到这里就完了,那么这题就真的玩完了,因为这题的数据范围可以“炸死”我们的long long,因此这题需要使用数组(字符串型)来保存,那么如果数组的长度是0的时候就是只有个位数,就直接加就好了,数组的长度是1的时候就是10,长度是2的时候就是100,说到这里,你们应该都知道怎么写了。
那么上我丑陋的代码(这份代码是在比赛的时候写出来的,可能有点乱,见谅!)
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=100000+100;
char s[N];

inline ll mo(ll x)
{
    if(x==0)
        return 0;
    return x%mod;
}

int main()
{
    scanf("%s",s);

    int len=strlen(s);
    ll sum=0,pos=0;
    for(int i=len-1;i>=0;i--)
    {
        ll num=s[i]-'0';
        ll w=0,t=0;
        for(int j=0;j<pos;j++)
        {
            w=t;
            t=mo(t*10)+num;
        }
        if(i==len-1)
            sum=num;
        else
            sum=sum+mo(mo((t-w)*17)+mo(w*9));
        //printf("w=%lld   t=%lld\n%lld \n",w,t,sum);
        sum=mo(sum);
        pos++;
    }
    cout<<(sum-1)<<endl;
    return 0;
}

3·D题
这题,我看了那些正确的代码,那些大佬才用了不到10ms就ac的代码,太骚了,太厉害 ,我看不懂,因此什么都不会的我,只有暴力给我使用了,我觉得这题的出题人很友好,看看数据范围字符串b的长度只有40,因此使用dfs去搜索字符串b的回文字符串,然后再去寻找字符串a和b一样的回文字符串,到这里应该就是可以去写代码了,但是我们还可以再优化一些,回想回文字符串的性质,前一半与后一半相同,因此我们dfs字符串b的回文字符串的长度一半就好了。
代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
string a,b;
char c[N];
int vis[N],lena,lenb;
int ans=0,p=0;

inline bool check(int pos,int len)
{
    p=1;
    int k=0;
    for(int i=lenb-1;i>pos;i--)
    {
        if(b[i]==c[k])
            k++;
        if(k==len)
        {
            p=0;
            return true;
        } 
    }

    if(k+1==len) return true;
    return false;
}

inline void dfs(int index,int len)
{
    if(2*len-1>lenb||index+1>=lenb) return ;
    if(ans<=2*len&&check(index,len))
    {
        int k=0,i=0;
        for(i=0;i<lena;i++)
        {
            if(c[k]==a[i])
                k++;
            if(k==len) break;
        }
        if(k!=len) return ;
        /*printf("i=%d len=%d \n",i,len);
        for(int i=0;i<len;i++)
            printf("%c",c[i]);printf("\n");*/
        int tk=0,tp=1;
        for(int j=lena-1;j>i;j--)
        {
            if(c[tk]==a[j])
                tk++;
            if(tk==len) 
            {
                tp=0;
                break;
            }
        }
        if(tk+1<len) return ;

        ans=max(ans,min(2*len-tp,2*len-p));
    }

    for(int i=index+1;i<lenb;i++)
    {
        if(vis[b[i]-'a'])
        {
            c[len]=b[i];
            len++;
            dfs(i,len);
            len--;
        }
    }
}

int main()
{
    cin>>a>>b;
    lena=a.length(),lenb=b.length();
    for(int i=0;i<lena;i++)
        vis[a[i]-'a']++;
    dfs(-1,0);
    printf("%d\n",ans);
    return 0;
}