CodeForces - 260B Ancient Prophesy

CodeForces - 260B Ancient Prophesy

A recently found Ancient Prophesy is believed to contain the exact Apocalypse date. The prophesy is a string that only consists of digits and characters “-”.

We’ll say that some date is mentioned in the Prophesy if there is a substring in the Prophesy that is the date’s record in the format “dd-mm-yyyy”. We’ll say that the number of the date’s occurrences is the number of such substrings in the Prophesy. For example, the Prophesy “0012-10-2012-10-2012” mentions date 12-10-2012 twice (first time as “0012-10-2012-10-2012”, second time as “0012-10-2012-10-2012”).

The date of the Apocalypse is such correct date that the number of times it is mentioned in the Prophesy is strictly larger than that of any other correct date.

A date is correct if the year lies in the range from 2013 to 2015, the month is from 1 to 12, and the number of the day is strictly more than a zero and doesn’t exceed the number of days in the current month. Note that a date is written in the format “dd-mm-yyyy”, that means that leading zeroes may be added to the numbers of the months or days if needed. In other words, date “1-1-2013” isn’t recorded in the format “dd-mm-yyyy”, and date “01-01-2013” is recorded in it.

Notice, that any year between 2013 and 2015 is not a leap year.

Input
The first line contains the Prophesy: a non-empty string that only consists of digits and characters “-”. The length of the Prophesy doesn’t exceed 105 characters.

Output
In a single line print the date of the Apocalypse. It is guaranteed that such date exists and is unique.

Examples
Input
777-444—21-12-2013-12-2013-12-2013—444-777
Output
13-12-2013

我也不太明白为什么我写的代码不对,一直WA在第三个上。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#define N 200100
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAX=2e6+5;
char a[100100];
char c[1000][10];
int d[1000];
int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
	int l,i,j,m,day,k,flag,maxx,t;
	while(scanf("%s",a)!=EOF){
		memset(c,0,sizeof(c));
		memset(d,0,sizeof(d));
		k=0;
		l=strlen(a);
		for(i=6;i<l-3;i++){
			if(a[i]=='2'&&a[i+1]=='0'&&a[i+2]=='1'&&a[i+3]>='3'&&a[i+3]<='5'){
//				cout<<"flag1"<<endl;
//				cout<<a[i-6]<<" "<<a[i-5]<<" "<<a[i-4]<<" "<<a[i-3]<<" "<<a[i-2]<<" "<<a[i-1]<<endl;
				if(a[i-1]=='-'&&a[i-4]=='-'&&a[i-2]<='9'&&a[i-2]>='0'&&a[i-3]>='0'&&a[i-3]<='9'&&a[i-5]<='9'&&a[i-5]>='0'&&a[i-6]<='9'&&a[i-6]>='0'){
//					cout<<"flag2"<<endl;
					m=(a[i-3]-'0')*10+(a[i-2]-'0');
					day=(a[i-5]-'0')*10+(a[i-4]-'0');
					if(m>12){
						continue;
					}
//					cout<<m<<" "<<day<<endl;
					flag=1;
					if(b[m]>=day){
						for(j=0;j<k;j++){
							if(c[j][0]==a[i-6]&&c[j][1]==a[i-5]&&c[j][2]==a[i-3]&&c[j][3]==a[i-2]&&c[j][4]==a[i]&&c[j][5]==a[i+1]&&c[j][6]==a[i+2]&&c[j][7]==a[i+3]){
								flag=0;
								d[j]++;
								break;
							}
						}
						if(flag){
							c[k][0]=a[i-6],c[k][1]=a[i-5],c[k][2]=a[i-3],c[k][3]=a[i-2],c[k][4]=a[i],c[k][5]=a[i+1],c[k][6]=a[i+2],c[k][7]=a[i+3];
							d[k]++;
							k++;
						}
					}
				}
			}
		}
		maxx=-1;
		t=0;
		for(i=0;i<k;i++){
			if(d[i]>maxx){
				maxx=d[i];
				t=i;
			}
		}
		printf("%c%c-%c%c-%c%c%c%c\n",c[t][0],c[t][1],c[t][2],c[t][3],c[t][4],c[t][5],c[t][6],c[t][7]);
	}
	return 0;
}

这是看着别人的代码写的。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include <cctype>
#define N 200100
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAX=2e6+5;
char str[100005];
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int cnt[4][16][32];
int main(){
	int d,m,y,id,ansd,len,i;
	d=m=y=-1;
	ansd=0;
	scanf("%s",str);
	len=strlen(str);
	for(i=0;i<len-9;i++){
		if(isdigit(str[i])&&isdigit(str[i+1])&&isdigit(str[i+3])&&isdigit(str[i+4])&&isdigit(str[i+6])&&isdigit(str[i+7])&&isdigit(str[i+8])&&isdigit(str[i+9])&&str[i+2]=='-'&&str[i+5]=='-'){
			d=(str[i+0]-48)*10+str[i+1]-48;
            m=(str[i+3]-48)*10+str[i+4]-48;
            y=(((str[i+6]-48)*10+str[i+7]-48)*10+str[i+8]-48)*10+str[i+9]-48;
            if(m>12||y<2013||y>2015||m<1)
				continue;
            if(d>month[m]||d<1)
				continue;
			if(++cnt[y-2013][m][d]>ansd){
				ansd=cnt[y-2013][m][d];
				id=i;
			}
		}
	}
	for(int i=0;i<10;i++)
		putchar(str[id+i]);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值