cf 158div.2 B. Ancient Prophesy-阿里云开发者社区

开发者社区> 云计算> 正文

cf 158div.2 B. Ancient Prophesy

简介:

  要求找到严格符合的dd-mm-yyyy的出现次数最多的日期,是严格符合,多个-或少个0都不可以,所以这题直接匹配就可以了

  比赛时候一直写的是分割,WA了n次……

 

这题主要学到了stringstream和strtok的用法。

strtok(s,"-");

strtok(NULL,"-"); 

只是对原字符串进行分割,并没有复制给一个新的,返回的指针是原字符串的位置。

直接匹配:

 

/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <map>
#define INF 1E9
using namespace std;
char s[100010];
const int D[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
map<string,int> num;
int main()
{
    gets(s);
    int i,day,month,year,Max=0;
    stringstream st;
    string t,ans;
    for(i=2;s[i+7];i++)
    {
        if(s[i]!='-'||s[i+3]!='-'||s[i+1]=='-'||s[i+2]=='-')continue;
        if(s[i-1]=='-'||s[i-2]=='-'||s[i+4]=='-'||s[i+6]=='-'||s[i+7]=='-'||s[i+5]=='-')continue;
        day=s[i-1]-'0'+(s[i-2]-'0')*10;
        month=(s[i+1]-'0')*10+s[i+2]-'0';
        year=(s[i+4]-'0')*1000+(s[i+5]-'0')*100+(s[i+6]-'0')*10+s[i+7]-'0';
        if(year<2013||year>2015)continue;
        if(month<1||month>12)continue;
        if(day<1||day>D[month])continue;
        if(day<10)st<<"0";
        st<<day<<"-";
        if(month<10)st<<"0";
        st<<month<<"-"<<year;
        st>>t;
        st.clear();
        num[t]++;
        if(num[t]>Max)
        {
            Max=num[t];
            ans=t;
        }
        //cout<<t<<endl;
    }
    cout<<ans<<endl;
}


划分:

/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <map>
#define INF 1E9
using namespace std;
char s[100010];
map<string,int> num;
int Max=0;
string ans;
int D[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char *p,*ll,*l,*now;
int main()
{
    gets(s);
    ll=strtok(s,"-");
    l=strtok(NULL,"-");
    bool flag=1,rflag;
    long long year,month,day;
    stringstream tt;
    string t;
    for(;now=strtok(NULL,"-");ll=l,l=now)
    {
        flag=1;
        int len=strlen(now);
        char te;
        if(len>4)
        {
            te=now[4];
            now[4]='\0';
        }
        if(len<4)continue;
        sscanf(now,"%I64d",&year);
        if(len>4) now[4]=te;
        if(*(l-1)=='-'||*(l+3)=='-')continue;
        switch(year)
        {
            case 2013:case 2014:case 2015:break;
            default:flag=0;break;
        }
        if(!flag)continue;
        if(strlen(l)!=2)continue;
        sscanf(l,"%I64d",&month);
        if(month<1||month>12)continue;
        sscanf(ll,"%I64d",&day);
        day%=100;
        if(day<1||day>D[month-1])continue;
        if(day<10)tt<<"0";
        tt<<day<<"-";
        if(month<10)tt<<"0";
        tt<<month<<"-"<<year;
        tt>>t;
        tt.clear();
        num[t]++;
        if(num[t]>Max)
        {
            Max=num[t];
            ans=t;
        }
    }
    cout<<ans<<endl;
}


 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章