牛人都是用字典树做的,字典树还没看,就用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; }