题解 | 牛客小白月赛93 BCDEF Java

生不逢七

https://ac.nowcoder.com/acm/contest/82401/A

B~F题解

B 交换数字

需要知道这个性质,两数之和相同的时候,两数之差越大,乘积越小,那么就让每位数字,a的大,b的小,再通过拆位“相乘”,时间复杂度O(n)

import java.util.*;
public class Main{
    static int mod=998244353;
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),a[]=new int[n],b[]=new int[n];
        String s=sc.next();
        for(int i=0;i<n;i++){
            a[i]=s.charAt(i)-'0';
        }
        s=sc.next();
        long num=0,ans=0;
        for(int i=0;i<n;i++){
            b[i]=s.charAt(i)-'0';
            if(a[i]<b[i]){
                a[i]^=b[i];
                b[i]^=a[i];
                a[i]^=b[i];
            }
            num=(num*10+a[i])%mod;
        }
        for(int i=n-1;i>=0;i--){
            ans=(ans+b[i]*num)%mod;
            num=num*10%mod;
        }
        System.out.println(ans);
    }
}

C 老&&虎&&机

按照期望的计算方法暴力计算,题中给出了逆元的公式,乘方可用快速幂计算,时间复杂度O(1)

import java.util.*;
public class Main{
    static int mod=998244353;
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        for(int i=0;i<t;i++){
            long m=sc.nextInt(),a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt();
            long sum=pow(m,3);
            System.out.println(pow(sum,mod-2)*m%mod*(c+(m-1)*((m-2)*a+b*3)%mod)%mod);
        }
    }
    static long pow(long a,int b){
        long ans=1;
        while(b!=0){
            if(b%2==1){
                ans=ans*a%mod;
            }
            b>>=1;
            a=a*a%mod;
        }
        return ans;
    }
}

D 幻兽帕鲁

反推每一层递归结束时候的x下标,重复n次,时间复杂度O(mn)

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=0;i<m;i++){
            long x=sc.nextLong();
            for(int j=0;j<n;j++){
                //每个循环内部的目的是,还原出x在敌对区间内长度为1<<(j+1)时的编号是多少
                long r=x&((1L<<(j+1))-1);//在此次递归组内的编号
                x=(x>>(j+1)<<(j+1))|(r<(1L<<j)?r<<1:(r-(1L<<j)<<1|1));
            }
            System.out.println(x);
        }
    }
}

实际上通过观察可知,答案的二进制正好是x的翻转,此方法时间复杂度O(mn)

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=0;i<m;i++){
            long x=sc.nextLong();
            List<Long> list=new ArrayList<>();
            for(int j=0;j<n;j++){
                list.add(x&1);
                x>>=1;
            }
            for(long a:list){
                x=x<<1|a;
            }
            System.out.println(x);
        }
    }
}

E 奏绝

本题需要利用前缀和解决,需要记载的数据分别为,01数量的前缀和,01分别下标的前缀和,以及截止到改下标,所有子区间影响值之和,计算的计算的时候,需要在“影响的前缀和”相应下标作差,得到的结果再减去两个区间之间相互的影响,时间复杂度O(n+m)

import java.io.*;
public class Main{
    static int mod=998244353;
    public static void main(String args[]) throws IOException{
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        String arr[]=bf.readLine().split(" ");
        int n=Integer.parseInt(arr[0]),m=Integer.parseInt(arr[1]),count[][]=new int[n+1][2];
        long sum[][]=new long[n+1][2],pre[]=new long[n+1];
        String c=bf.readLine();
        for(int i=1;i<=n;i++){
            int a=c.charAt(i-1)-'0';
            count[i]=count[i-1].clone();
            sum[i]=sum[i-1].clone();
            pre[i]=(pre[i-1]+(long)count[i-1][a^1]*i%mod+mod-sum[i-1][a^1])%mod;
            count[i][a]++;
            sum[i][a]=(sum[i][a]+i)%mod;
        }
        for(int i=0;i<m;i++){
            arr=bf.readLine().split(" ");
            int l=Integer.parseInt(arr[0]),r=Integer.parseInt(arr[1]);
            bw.write((mod+(pre[r]-pre[l-1]-((sum[r][0]-sum[l-1][0])*count[l-1][1]-sum[l-1][1]*(count[r][0]-count[l-1][0]))-((sum[r][1]-sum[l-1][1])*count[l-1][0]-sum[l-1][0]*(count[r][1]-count[l-1][1])))%mod)%mod+"\n");
        }
        bw.flush();
    }
}

F 本初字符串

参开资料

首先明确的是,答案的长度一定是s长度的约数,因为假如不是的话,得到的“本初”的某些下标对应的s下标一定是相同的,且周期性分布,要想得到较大的匹配,这些位置字母要相同,那么不如直接缩短本初的长度,时间复杂度O(t*n*d(n)*C),其中d(n)是n的约数个数,C是字符串中字母集大小,这里C==26

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        for(int i=0;i<t;i++){
            String s=sc.next();
            int n=s.length();
            for(int j=1;j<=n;j++){
                if(n%j==0){
                    String ans=find(s,j);
                    if(ans!=null){
                        System.out.println(ans);
                        break;
                    }
                }
            }
        }
    }
    static String find(String s,int len){
        int count[][]=new int[len][26],max[]=new int[len+1];
        for(int i=0;i<s.length();i++){
            count[i%len][s.charAt(i)-'a']++;
        }
        for(int i=len-1;i>=0;i--){
            for(int j=0;j<26;j++){
                max[i]=Math.max(max[i],max[i+1]+count[i][j]);
            }
        }
        if(max[0]*2<s.length()){
            return null;
        }
        char ans[]=new char[len];
        int pre=0;
        for(int i=0;i<len;i++){
            for(int j=0;j<26;j++){
                if((pre+count[i][j]+max[i+1])*2>=s.length()){
                    ans[i]=(char)(j+'a');
                    pre+=count[i][j];
                    break;
                }
            }
        }
        return new String(ans);
    }
}
全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务