• 牛客练习赛42(A,B)


    A:链接:https://ac.nowcoder.com/acm/contest/393/A

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    给定两个等长的由小写字母构成的串 A,BA,B,其中 |A|=|B|=

    现在你需要求出一个子区间 [l,r]使得 LCP(A[l,r],B[l,r])×LCS(A[l,r],B[l,r])+LCP(A[l,r],B[l,r])+LCS(A[l,r],B[l,r]最大,并输出这个值。

    LCP(S,T)表示S和T的最长公共前缀,LCS(S,T)表示S和T的最长公共后缀。

    输入描述:

    第一行一个字符串 AA。

    第二行一个字符串 BB 。

    输出描述:

    一行一个整数,表示答案。
    示例1

    输入

    aaabbbcccddd
    aaaddddddddd

    输出

    15

    说明

    选择 l=1,r=12  是一种可行的最优解。

    备注:

    对于所有数据,保证 n200000 ,串 A,B仅由小写字母构成。

    思路:一眼看是最长公共前缀和最长公共后缀。但是稍微想一下,其实只需要求一次最长公共前缀就行了,因为无论怎么样对于一段连续字符串来说,最长前缀和最长后缀是一样的。
        比如说aaabab和aaaccc,最优情况是选前三个字母aaa。
    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    const LL mod = 100000007;
    int dp[200000];
    int main(){
        string s1,s2;
        cin>>s1>>s2;
        memset(dp,0,sizeof(dp));
        int a = 0,b = 0;
        for(int i = 1 ; i <= s1.size() ; i ++){
            if(s1[i-1] == s2[i-1]){
                dp[i] = dp[i-1]+1; 
            }else{
                dp[i] = 0;
            }
            a = max(a,dp[i]);
        }
        LL ans = a*a*1LL + 2LL*a;
        printf("%lld
    ",ans);
    }/*
    aaabbbddccdd
    aaaddddddddd
    */

    B:链接:https://ac.nowcoder.com/acm/contest/393/B
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 524288K,其他语言1048576K
    64bit IO Format: %lld

    题目描述

    注意本题有模数
    给定一个 长度为 n 的序列 { a } ,求:
    max1ijn{(aiai+1aj)+(ai+ai+1++aj)}mod100000007
    其中  表示异或

    输入描述:

    第一行一个整数 n 。
    第二行 n 个整数,表示 ai

    输出描述:

    一行一个整数 ans ,表示答案。
    示例1

    输入

    3
    1 2 3

    输出

    6

    说明

    我们 显然需要将所有的数字都选上,此时 ans=(123)+1+2+3=6

    备注:

    对于所有的数据,保证 1n3×105,0ai<220 。

    样例:想不到吧,你的做法至少能过样例!

    思路:没啥好说的,对于一个数a_i,即使前面出现过a_i这个数,大不了就是异或等于0,但是会再加上a_i,对ans贡献肯定是增大的。所以选所有数就好啦。

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    const LL mod = 100000007;
    int main(){
        int n;
        scanf("%d",&n);
        LL s1 = 0,s2 = 0;
        for(int i = 0 ; i < n ; i ++){
            LL x;
            scanf("%lld",&x);
            s1 += x;
            s1 %=mod;
            s2 ^= x;
            s2 %= mod;
        }
        printf("%lld
    ",(s1+s2+mod)%mod);
    }

    C:链接:https://ac.nowcoder.com/acm/contest/393/C
    来源:牛客网

    时间限制:C/C++ 2秒,其他语言4秒
    空间限制:C/C++ 524288K,其他语言1048576K
    64bit IO Format: %lld

    题目描述

    给定m个长为n的序列a1,a2,,am

    小Z想问你:

    ni1=1ni2=1nim=1SUM(a1,i1,a2,i2,,am,im)  mod1000000007
    其中SUM()SUM(一个序列)表示这个序列中所有不同的数的和,相当于先sort,unique再求和。

    输入描述:

    第一行两个整数n,m。

    接下来m行,每行n个整数,第i行第j个表示ai,jai,j

    输出描述:

    一行一个整数,表示答案。
    示例1

    输入

    2 3
    1 2
    2 3
    1 3
    

    输出

    36

    说明

    一共有8种情况:

    SUM(1,2,1)=3 SUM(1,2,3)=6 SUM(1,3,1)=4 SUM(1,3,3)=4
    SUM(2,2,1)=3 SUM(2,2,3)=5 SUM(2,3,1)=6 SUM(2,3,3)=5
    把所有数字结果加起来就是36。

    备注:

    对于所有100%100%的数据,有1n,m2000,0ai,j10^9


    题意:求这个式子的和,不难理解,按样例来说,就是每行的2个选1个,组成的所有情况。就是2^3=8种。然后按照题目给的意思计算。
    思路:待更新。

  • 相关阅读:
    内存对齐
    C++中构造函数
    计算机视觉领域的大牛主页
    各种银行卡的收费情况
    常识
    毕业生必须知道
    计算机视觉领域资料
    人际关系
    生活常识
    可使用在项目的web gantt甘特图有哪些?
  • 原文地址:https://www.cnblogs.com/Esquecer/p/10557960.html
Copyright © 2020-2023  润新知