Codeforces Round #425 (Div.2)

来源:互联网 发布:安卓手机助手 for mac 编辑:程序博客网 时间:2024/06/07 02:47

A.

题意:n个木条,每次取出k个,第一个人先取出k个,然后第二个人再取出k个...重复此过程,如果最后轮到第一个人取时,木条不足k个,就输出NO,如果最后轮到第二个人取时,木条不足k个,就输出YES

解题思路:模拟.如果取完奇数次之后木条不足k个就是当轮到第二个人取时,木条不足k个,输出YES,如果取完偶数次之后木条不足k个就是当轮到第一个人取时,木条不足k个,输出NO,不能直接for循环进行判断,会超时

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;int main(){    ll n,k;    while(cin>>n>>k)    {        ll cnt=n/k;        if(cnt%2)cout<<"YES"<<endl;        else cout<<"NO"<<endl;    }    return 0;}


B.

题意:先输入一个好字符串,除了好字符串中的字符之外,其余都是坏字符,再输入一个原字符串,接下来是n种查询,判断原字符串是否能变成给出的字符串,原字符串中的'?'要变成一个好字符,‘*’可以变成一个空字符或者是一个任意长度的坏字符串,‘*’至多出现一次

解题思路:这里主要是对‘*’的处理,因为‘*’变成坏的字符串的长度不确定,所以给出的字符串与原字符串长度的区别就是因为‘*’,先判断原字符串中是否有‘*’,如果有的话再判断如果给出的字符串的长度比原字符串-1要小,那么直接输出NO,因为别的字符都是一 一对应的,如果没有‘*’并且两字符串的长度不一样那么也直接输出NO,否则就要进行下面的判断,因为长度的变化是因为‘*’,所以计算出两个字符串长度的差(后-原),‘*’就变成了差值那么长的字符串,再逐一进行判断即可,还要注意长度变化k的使用

代码:

#include<bits/stdc++.h>using namespace std;int main(){    char s0[100005];    while(cin>>s0)    {        int x[30];        memset(x,0,sizeof(x));        for(int i=0;i<strlen(s0);i++)        {            x[s0[i]-'a']=1;        }        char s[100005];        cin>>s;        int len=strlen(s);        int ans=0;        for(int i=0;i<len;i++)        {            if(s[i]=='*'){ans=1;break;}        }        int n;        cin>>n;        while(n--)        {            char s1[100005];            cin>>s1;            int flag=0,k=0;            int len1=strlen(s1);            if(ans==1&&len1<len-ans){cout<<"NO"<<endl;continue;}            if(ans==0&&len1!=len){cout<<"NO"<<endl;continue;}            for(int i=0;i<len;i++)            {                if(s[i]=='?')                {                    if(x[s1[i+k]-'a']==0)                    {                        flag=1;                        break;                    }                }                else if(s[i]=='*')                {                    for(int j=i;j<=len1-len+i;j++)                    {                        if(x[s1[j+k]-'a']==1)                        {                            flag=1;                            break;                        }                    }                    k=len1-len;                }                else                {                    if(s[i]!=s1[i+k])                    {                        flag=1;                        break;                    }                }            }            if(flag)cout<<"NO"<<endl;            else cout<<"YES"<<endl;        }    }    return 0;}



原创粉丝点击