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