版权声明:本文为博主原创文章,未经博主允许可以转载,但要注明出处 https://blog.csdn.net/wang3312362136/article/details/81702255
比赛链接
https://codeforces.com/contest/1016
A. Death Note
题目大意
有一本死亡笔记,一页可以写 个名字。现在你要写 天,每天写 个名字,问每一天翻了多少页,写满了一页就必须翻一页。
题解
暴力模拟, 。
B. Segment Occurrences
题目大意
给一个串 和一个串 , 组询问,每组询问给出 ,求 在 中出现了多少次。
题解
暴力匹配, 就可以过了,当然也可以kmp。
C. Vasya And The Mushrooms
题目大意
的矩阵,每个点有一个权值,从 出发,每个点经过且仅经过一次,可以往上下左右走,经过每个点获得的收益为 , 为当前是第几次经过它(从0开始), 是权值,求最大收益。
题解
如果往同一个方向走了两次,就不能走回头路了,因此可以搜索, 。
D. Vasya And The Matrix
题目大意
构造一个 的矩阵,每一行的异或值为 ,每一列的异或值为 。
题解
拆开每一二进制位考虑,对于每一行尽量保证列的异或值,如果凑不出行的异或值就强行在任意一个地方异或,以保证行的异或值是对的,到了最后还不能保证输出-1.
代码
A. Death Note
#include <cstdio>
const int maxn=200000;
int read()
{
int x=0,f=1;
char ch=getchar();
while((ch<'0')||(ch>'9'))
{
if(ch=='-')
{
f=-f;
}
ch=getchar();
}
while((ch>='0')&&(ch<='9'))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int n,m,a[maxn+10],past;
int main()
{
n=read();
m=read();
for(int i=1; i<=n; ++i)
{
a[i]=read();
int k=a[i]+past;
printf("%d ",k/m);
past=k%m;
}
return 0;
}
B. Segment Occurrences
#include <cstdio>
#include <algorithm>
const int maxn=1000;
int n,m,q,oc[maxn+10],cnt;
char s[maxn+10],t[maxn+10];
int main()
{
scanf("%d%d%d%s%s",&n,&m,&q,s,t);
for(int i=0; i<=n-m; ++i)
{
int flag=0;
for(int j=0; j<m; ++j)
{
if(s[i+j]!=t[j])
{
flag=1;
break;
}
}
if(!flag)
{
oc[i]=1;
}
}
for(int i=1; i<n; ++i)
{
oc[i]+=oc[i-1];
}
while(q--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",std::max(0,((b>=m)?oc[b-m]:0)-((a>=2)?oc[a-2]:0)));
}
return 0;
}
D. Vasya And The Matrix
#include <cstdio>
const int maxn=100;
int read()
{
int x=0,f=1;
char ch=getchar();
while((ch<'0')||(ch>'9'))
{
if(ch=='-')
{
f=-f;
}
ch=getchar();
}
while((ch>='0')&&(ch<='9'))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int n,m,a[maxn+10],b[maxn+10],c[maxn+10][maxn+10];
int main()
{
n=read();
m=read();
int can=0;
for(int i=1; i<=n; ++i)
{
a[i]=read();
can^=a[i];
}
for(int i=1; i<=m; ++i)
{
b[i]=read();
can^=b[i];
}
if(can)
{
puts("NO");
return 0;
}
for(int k=0; k<=30; ++k)
{
int sta=1<<k;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
if(b[j]&sta)
{
b[j]^=sta;
a[i]^=sta;
c[i][j]^=sta;
}
}
if(a[i]&sta)
{
b[1]^=sta;
a[i]^=sta;
c[i][1]^=sta;
}
}
}
puts("YES");
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
printf("%d ",c[i][j]);
}
puts("");
}
return 0;
}