牛人都是用字典树做的,字典树还没看,就用vector+数组做,时间多了点儿
ACgirl是ACM集训队里的一朵奇葩(大家懂的……),在学校有很多GG对ACgirl心生爱慕之情,因为学校的GG比较害羞,不敢当着ACgirl面表白,还好现在大家都有手机,于是GG们疯狂的给ACgirl发爱慕表白的短信。于是ACgirl的手机的短信都爆满,为了改变这样的状况,她叫你帮忙写一个短信过滤的短信卫士,过滤哪些无聊的短信。
- 输入
- 本题有多组测试数据,以EOF为输入结束的标志。
第一行是一个整数n(1 <= n <= 100)表示有多少组测试数据(有多组n),接下来是每一组测试数据,每一组测试数据的第一行是一个整数m(1 <= m <= 100000),表示ACgirl的手机短信的白名单,接下来是m行的白名单,每一个行数据代表一个手机号码TelNumber(最长为11个字符)全由数字组成(0~9),接下来为一个整数k(1 < = k <= 10000)表示有k条来访短信,每条短信的的格式为getTime,TelNumber,Context(英文逗号前后都没有空格)。其中getTime(yyyy-mm-tt:hh:mm:ss)为接收到短信的时间(精确到秒),TelNumber(最多为11个字符)为发送短信的手机号码,Context(最多为100个字符)为短信内容,短信内容中保证至少有两个个逗号“,”(英文)。 输出 - 对于每组测试数据,先输出”Case n:”,n从1开始,对于手机号码为白名单的短信进行回复,对于无效的短信(短信的某个域不合法,例如域的内容不能为空,时间要检查合法性)和其他手机号码的短信进行过滤不用回复,回复格式和收到的短信的格式是一样的,其中getTime为接收到的短信时间,TelNumber 为15980698888,context为Sorry,I am ACb0y's girl friend。每一组测试数据最后输出统计信息,统计一共回复了多少短信,格式为:”count = xxx”,等号左右各一个空格,具体看输出样例。 样例输入
-
1 5 15980698852 18580693352 16345698867 15666456445 12340694552 5 2011-03-09:13:32:34,15980698881,I love you. 0051-03-09:08:02:58,15980698881,I love you. 2011-02-29:13:32:34,18580693352,Acgirl I love you 2011-02-28:13:32:34,18580693352, 2025-03-10:23:15:48,12340694552,My name is Smith,I like you very much.
样例输出 -
Case 1: 2025-03-10:23:15:48,15980698888,Sorry,I am ACb0y's girl friend count = 1
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<stdlib.h>
using namespace std;
map<string,int>tel;
vector<int>result[10011];
int main()
{
int cases,n,i,j,m,k;
char tep[12],message[1011],year[5],month[3],day[3],hour[3],min[3],second[3],telphone[12],total;
while(scanf("%d",&cases)!=EOF)
{
int count=0;
while(cases--)
{
//注意清0,map和vector都要清0
tel.clear();
for(i=0;i<10001;i++)
{
result[i].clear();
}
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",tep);
tel[tep]=i+1;
}
scanf("%d",&m);
getchar();
//注意getchar()否则错误
total=0;
for(j=0;j<m;j++)
{
gets(message);
int x=strlen(message);
if(x<21) continue;
year[0]=message[0];year[1]=message[1];
year[2]=message[2];year[3]=message[3];
year[4]='\0';
month[0]=message[5];month[1]=message[6];
month[2]='\0';
day[0]=message[8];day[1]=message[9];
day[2]='\0';
hour[0]=message[11];hour[1]=message[12];
hour[2]='\0';
min[0]=message[14];min[1]=message[15];
min[2]='\0';
second[0]=message[17];second[1]=message[18];
second[2]='\0';
int yy,mm,dd,hh,mt,ss;
yy=atoi(year);mm=atoi(month);dd=atoi(day);
hh=atoi(hour);mt=atoi(min);ss=atoi(second);
for(k=20;;k++)
{
if(message[k]>='0'&&message[k]<='9')
telphone[k-20]=message[k];
else break;
}
telphone[k-20]='\0';
if((x-k)==1||(x-k)==0) continue;
//注意这里的if语句有两个情况需要判断第1种,2011-02-28:13:32:34,18580693352,第二种2011-02-28:13:32:34,18580693352
//也就是最后有没有‘,’的两种不同的情况
if(tel[telphone]==0) continue;
if(hh>=24||mt>=60||ss>=60||mm>12||dd>31||yy==0||mm==0||dd==0) continue;
if(mm==4||mm==6||mm==9||mm==11)
{
if(dd>30) continue;
}
if(mm==2)
{
if(yy%400==0||(yy%4==0)&&(yy%100!=0))
{
if(dd>29) continue;
}
else
{
if(dd>28)continue;
}
}
result[total].push_back(yy);
result[total].push_back(mm);
result[total].push_back(dd);
result[total].push_back(hh);
result[total].push_back(mt);
result[total].push_back(ss);
total++;
}
printf("Case %d:\n",++count);
for(i=0;i<total;i++)
{
printf("%04d-%02d-%02d:%02d:%02d:%02d,15980698888,Sorry,I am ACb0y's girl friend\n",result[i][0],result[i][1],result[i][2],result[i][3],result[i][4],result[i][5]);
}
printf("count = %d\n",total);
}
}
return 0;
}