A
题意:给你n根棍子,两个人每次拿m根你,你先拿,如果该谁拿的时候棍子数<m,这人就输,对手就赢,问你第一个拿的人能赢吗
代码:
#include<stdio.h>
#define ll long long
using namespace std;
ll n,m;
int main()
{
while(~scanf("%I64d%I64d",&n,&m))
{
ll r=n/m;
if(r%2==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
B:字符串,暴力
题意:给你的第一串里的字符都是好的,除开这个字符以外的所有小写字符都是坏了,然后再给你一个待匹配的的串,这个串中的’?‘可以替换成任何一个好的小写字符,‘*’表示可以替换成一个空的字符串或是一个全部由坏的小写字符组成的字符串(长度可以为1,也可以大于1)。然后下面开始询问,输入一个串问能不能由上面的串得来,可以就输出YES,否则输出NO
几组样例吧
abc
a*?b
3
acb
YES
aicb
YES
ab
NO
k
aaa
1
aa
NO
这个题有个bug我觉得因为对于下面的数据
a
*?
2
a
NO
ba
NO
这里应该都输出YES才对,但是我的代码在codeforces上过了,应该第二个字符串必须包含小写字符吧。
代码:
#include<stdio.h>
#include<string.h>
using namespace std;
char a[30];
int vis[30];
char b[111000];
int n;
char c[111000];
int main()
{
while(~scanf("%s",a))
{
memset(vis,0,sizeof(vis));
for(int i=0; a[i]; i++)
vis[a[i]-'a']=1;
scanf("%s",b);
scanf("%d",&n);
int ans=0;
for(int i=0;b[i];i++)
if(b[i]=='*')
ans++;
for(int l=0; l<n; l++)
{
int flag=0;
scanf("%s",c);
int x=strlen(b);
int y=strlen(c);
int i=0,j=0;
if(ans==0&&y!=x)
flag=1;
if(ans==1&&y<x-1)
flag=1;
else
while(i<x&&j<y)
{
if(b[i]==c[j])
{
i++;
j++;
continue;
}
else if(b[i]=='?')
{
if(vis[c[j]-'a']==0)
{
flag=1;
break;
}
else
{
i++;
j++;
continue;
}
}
else if(b[i]=='*')
{
if(y==x-1)
{
i++;
continue;
}
else
{
for(int k=j; k<=j+y-x; k++)
{
if(vis[c[k]-'a']==1)
{
flag=1;
break;
}
}
if(flag==1)
break;
i++;
j=j+y-x+1;
}
}
else
{
flag=1;
break;
}
}
if(flag==1)
printf("NO\n");
else
printf("YES\n");
}
}
return 0;
}