牛客练习赛53

题号 标题 已通过代码 题解 讨论 通过率 我的状态
A 超越学姐爱字符串 点击查看 进入题解 进入讨论 798/1844  通过
B 美味果冻 点击查看 进入题解 进入讨论 245/1119 未通过
C 富豪凯匹配串 点击查看 进入题解 进入讨论 262/884 通过
D 德育分博弈政治课 点击查看 进入题解 进入讨论 88/407 未通过
E 老瞎眼 pk 小鲜肉 点击查看 进入题解 进入讨论 182/593 未通过
F 柳下惠的数学题 点击查看 进入题解 进入讨论 13/37 未通过

 

A

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

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

题目描述

超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢“c”和“y”。因此超越学姐喜欢只含有“c”和“y”的字符串,且字符串中不能出现两个连续的“c”。请你求出有多少种长度为n的字符串是超越学姐喜欢的字符串。答案对1e9+7取模。

输入描述:

输入一个整数n。
1<=n<=100000

输出描述:

输出一个整数表示答案。

示例1

输入

复制

3

输出

复制

5

说明

cyy,cyc,yyy,yyc,ycy
#include
#include
#include
#include
#define ll long long
using namespace std;
const ll mod=1e9+7;
const int maxn=100000;
ll ans[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    ans[1]=2,ans[2]=3;
    for(int i=3;i<=n;i++)
    {
        ans[i]=(ans[i-1]%mod+ans[i-2]%mod)%mod;
    }
    printf("%lld\n",ans[n]%mod);
}

B

牛客练习赛53_第1张图片

 


 

OJ题号

美味果冻

https://ac.nowcoder.com/acm/contest/1114/B

简单题意

求该式子

正解思路

交换一下确实没想出来,但是该打一下表的

打表真好

详细链接

#include
using namespace std;
#define ll long long
const int mod=1e9+7;
const int maxn=3e6+10;
int p[maxn];
int main()
{
    for(int i=0;i>n;
    int ans=0;
    for(int j=1;j<=n;j++)
    {
        int limit=n/j,l=j,r=j+j-1;
        for(int i=1;i

C

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

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

题目描述

有n个长度为m的文本串,每个串只含有'0'和'1'。接下来有Q次询问,每次给出一个长度为m的字符串,且只含有'0','1'和'_'。如10_1_1。下划线可以匹配'0'或'1'。即10_1_1可以匹配101111,101101,100111,100101四种串。每次询问求出n个文本串中有多少个可以与当前询问的串匹配。

输入描述:

第一行输入n,m
接下来n行,每行输入一个长度为m的01串表示一个文本串。
第n+2行输入Q
接下来Q行,每行输入一个长度为m的字符串(只包含'0','1','_')。
1<=n,m<=1000,1<=Q<=3000。

输出描述:

对于每次询问,输出n个文本串中有多少个与当前询问的串匹配。

示例1

输入

复制

5 6
101101
011011
100110
111000
101111
2
1011_1
1__1__

输出

复制

2
3

说明

第一次询问:有101101,101111与1011_1匹配
第二次询问:有101101,   100110,   101111与1__1__匹配

 


35.

OJ题号

富豪凯匹配串

https://ac.nowcoder.com/acm/contest/1114/C

简单题意

有n个长度为m的文本串,每个串只含有'0'和'1'。接下来有Q次询问,每次给出一个长度为m的字符串,且只含有'0','1'和'_'。如10_1_1。下划线可以匹配'0'或'1'。即10_1_1可以匹配101111,101101,100111,100101四种串。每次询问求出n个文本串中有多少个可以与当前询问的串匹配。

正解思路

我们利用&的性质:0&1=0,0&0=0,1&0=0,1&1=1

我们发现对于每一个查询str可以把第i位:_ 看成0(把str转化为s),s[i]&a[i]的匹配目标为t[i],t[i]=0

str可以把第i位:1看成1(把str转化为s),s[i]&a[i]的匹配目标为t[i],t[i]=1

str可以把第i位:0看成1(把str转化为s),s[i]&a[i]的匹配目标为t[i],t[i]=0

 

详细链接

 

#include 
using namespace std;
#define N 10000+5
typedef long long ll;
bitset a[N],s,t;
char str[N];

int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		 scanf("%s",str);
		 for(int j=0;j

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

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

题目描述

老瞎眼有一个长度为 n 的数组 a,为了为难小鲜肉,他准备了 Q 次询问,每次给出 一个区间[L,R],他让小鲜肉寻 找一对 l,r 使L<=l<=r<=R 且 a[l]^a[l+1]^a[l+2]...^a[r]=0,老瞎眼只让他回答r-l+1 最小是多少,若没有符合条件的 l,r 输出”-1”。 

输入描述:

第一行输入 n,Q。
第二行输入 n 个数,表示 a 数组。
接下来 Q 行,每行输入 L,R。
1<=n,Q<=500000,0<=a[i]<=1000000,1<=L<=R<=n

输出描述:

若有解,输出 r-l+1 最小是多少。
否则输出“-1”。

示例1

输入

复制

4 2
2 1 3 3
1 2
1 3

输出

复制

-1
3

说明

第一次询问无解。
第二次询问:
l=1,r=3

 

#include 
#include 
#define lson rt<<1, l , mid
#define rson rt<<1|1, mid+1 , r
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 5e5+6;
int n, q;
int pos[maxn<<2], pre[maxn], tree[maxn<<2], ans[maxn];
struct node{
    int l,r,id;
    bool operator<(const node x)const{
        return r>1;
    if(pos<=mid) update(lson, pos, val);
    else update(rson, pos, val);
    push_up(rt);
}
int query(int rt, int l, int r, int ul, int ur){
    if(ul<=l&&r<=ur) return tree[rt];
    int mid = (l+r)>>1, ans = INF;
    if(ur<=mid) return query(lson, ul, ur);
    else if(ul>mid) return query(rson, ul, ur);
    else return min(query(lson, ul, ur),query(rson, ul, ur));
}
/*这种写法也可以,但是就我以前做过的一道题目来说上面那种更快(不知道为啥,还有待考证)
int query(int rt, int l, int r, int ul, int ur){
    if(ul<=l&&r<=ur) return tree[rt];
    int mid = (l+r)>>1, ans = INF;
    if(ul<=mid) ans = min(ans, query(lson, ul, ur));
    if(ur>mid) ans = min(ans, query(rson, ul, ur));
    return ans;
}
*/
int main(){
    scanf("%d%d", &n, &q);
    for(int i = 1;i <= 4*500000; i++){
        pos[i] = -1;
        tree[i] = INF;
    }
    int sum = 0; pos[0] = 0;
    for(int i = 1,x; i <= n; i++){
        scanf("%d",&x);
        sum ^= x;
        if(pos[sum]!=-1)
            pre[i]=pos[sum]+1;
        else
            pre[i]=-1;
        pos[sum]=i;
    }
    for(int i = 1; i <= q; i++){
        scanf("%d%d", &Q[i].l, &Q[i].r);
        Q[i].id = i;
    }
    sort(Q+1, Q+1+q);
    int cnt = 1;
    
    for(int i=1;i<=n;i++)
    {
        if(pre[i]!=-1)
        {
            update(1,1,n,pre[i],i-pre[i]+1);
        }
        while(i==Q[cnt].r)
        {
            ans[Q[cnt].id]=query(1,1,n,Q[cnt].l,Q[cnt].r);
            cnt++;
        }
    }
   
    for(int i = 1; i <= q; i++){
        printf("%d\n", ans[i]==INF?-1:ans[i]);
    }
    return 0;
}

 

你可能感兴趣的:(数论——除法分块,数据结构--线段树,好题)