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;
}
最後更新:2017-04-04 07:03:15