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;
}