题干:
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
题目大意:
有一个字符串,让你找出其中最多的合法日期出现次数,格式为:dd-mm-yyyy。
解题报告:
学会了KMP,自然会接触到BF算法吧。。不难想到这题的数据量肯定是要暴力的。于是乎又到了考验代码仔细度的时候了。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
char s[MAX];
char tmp[15];
string ans;
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
map<string,int> mp;
map<string,int> :: iterator it;
int main()
{
cin>>s;
int len = strlen(s);
for(int i = 0; i<=len-10; i++) {
for(int j = 0; j<10; j++) {
tmp[j] = s[j+i];
}
tmp[10]='\0';
if(tmp[6] != '2' || tmp[7] != '0' || tmp[8] != '1') continue;
if(tmp[9] != '3' && tmp[9] != '4' && tmp[9] != '5') continue;
//处理年份
if(tmp[2] != '-' || tmp[5] != '-') continue;
if(!isdigit(tmp[0]) || !isdigit(tmp[1]) || !isdigit(tmp[3]) || !isdigit(tmp[4]) || !isdigit(tmp[6]) || !isdigit(tmp[7]) || !isdigit(tmp[8]) || !isdigit(tmp[9])) continue;
int yue = (tmp[3]-'0')*10+tmp[4]-'0';
if(yue <=0 || yue > 12) continue;
int day = (tmp[0]-'0')*10 + tmp[1]-'0';
if(day > month[yue] || day <= 0) continue;
mp[tmp]++;
}
it = mp.begin();
int maxx = 0;
for(;it!=mp.end(); ++it) {
if(maxx < (it->second)) {
maxx = it->second;
ans= it->first;
}
}
cout << ans << endl;
return 0 ;
}
总结:
刚开始1WA发现那个if(day > month[yue] || day <= 0) continue;写成了day<0,,改过来交一发还是WA,想想可能是因为‘-’字符没有判断正确,于是直接把所有的都判断一遍。,再交AC了。