Crontab

哈哈本人的不及格代码(暂留):

  1 #include<iostream>
  2 #include<queue>
  3 #include<cmath>
  4 #include<map>
  5 #include<cstring>
  6 using namespace std;
  7 int n;
  8 __int64 s,t;
  9 char command[21][6][100];
 10
 11 map<string,int> mapmonth;
 12 map<string,int> mapweek;
 13
 14 bool month[21][13];
 15 bool week[21][7];
 16 bool minute[21][61];
 17 bool hour[21][24];
 18 bool day[21][32];
 19
 20 void judgeMon(bool* mon,char *tm,map<string,int> mymap,int len)
 21 {///判断月或是周是否符合条件
 22     if(tm[0]=='*'){
 23         memset(mon,true,len);
 24         return;
 25     }
 26     for(int i=0;i<strlen(tm);)
 27     {
 28         if(tm[i] == ',') i++;
 29         ///如果是数字的话
 30         int mon1 = 0;
 31         while('0'<=tm[i] && tm[i]<='9')
 32         {
 33             mon1 = mon1*10 + tm[i++]-'0';
 34         }
 35         ///如果是字母的话
 36         char monstr[100];int temp = 0;bool flag = false;
 37         while('A'<=tm[i]&&tm[i]<='Z' || 'a'<=tm[i]&&tm[i]<='z')
 38         {
 39             monstr[temp++] = tm[i++];
 40             flag = true;
 41         }
 42         monstr[temp] = '\000';
 43         if(flag) mon1 = mymap[monstr];
 44
 45         mon[mon1] = true;
 46
 47         if(tm[i] == ',') i++;
 48         else if(tm[i]=='-')
 49         {
 50             i++;
 51             ///如果是数字的话
 52             int mon2 = 0;
 53             while('0'<=tm[i] && tm[i]<='9')
 54             {
 55                 mon2 =mon2*10 + tm[i++]-'0';
 56             }
 57
 58             ///如果是字母的话
 59             int temp = 0;flag = false;
 60             while('A'<=tm[i]&&tm[i]<='Z' || 'a'<=tm[i]&&tm[i]<='z'){
 61                 monstr[temp++] = tm[i++];
 62                 flag = true;
 63             }
 64             monstr[temp] = '\000';
 65             if(flag) mon2 = mymap[monstr];
 66             for(int k=mon1;k<=mon2;k++)
 67                 mon[k] = true;
 68         }
 69     }
 70 }
 71 void judgeNum(bool *mon,char *tm,int len)
 72 {
 73     if(tm[0]=='*')
 74     {
 75         memset(mon,true,len);
 76         return;
 77     }
 78     for(int i=0;i<strlen(tm);)
 79     {
 80         if(tm[i] == ',') i++;
 81         ///如果是数字的话
 82         int mon1 = 0;
 83         while('0'<=tm[i] && tm[i]<='9')
 84         {
 85             mon1 = mon1*10 + tm[i++]-'0';
 86         }
 87
 88         mon[mon1] = true;
 89
 90         if(tm[i] == ',') i++;
 91         else if(tm[i]=='-')
 92         {
 93             i++;
 94             ///如果是数字的话
 95             int mon2 = 0;
 96             while('0'<=tm[i] && tm[i]<='9')
 97             {
 98                 mon2 =mon2*10 + tm[i++]-'0';
 99             }
100
101             for(int k=mon1;k<=mon2;k++)
102                 mon[k] = true;
103         }
104     }
105 }
106
107
108 ///年月日推算星期几
109 int weekday(int N, int M, int d)
110 {
111     int m, n, c, y, w;
112     m = (M - 2) % 12;
113     if (M >= 3) n = N; else n = N - 1;
114     c = n / 100;
115     y = n % 100;
116     w = (int)(d + floor(13 * m / 5) + y + floor(y / 4) + floor(c / 4) - 2 * c) % 7;
117     while (w<0) w += 7;
118     return w;
119 }
120 bool isleapyear(int y)
121 {
122     return (y%4==0&&y%100)||y%400==0;
123 }
124
125 int daysOfMonth(int yy,int mm)
126 {
127     if(mm == 1 || mm==3 || mm==5 || mm==7 || mm==8 || mm==10 || mm==12) return 31;
128     if(mm==4 || mm==6 || mm==9 || mm==11) return 30;
129     if(mm == 2)
130     {
131         if(isleapyear(yy)) return 29;
132         else return 28;
133     }
134     return 0;
135 }
136
137 int main()
138 {
139     mapmonth["Jan"] = 1;mapmonth["Feb"] = 2;mapmonth["Mar"] = 3;mapmonth["Apr"] = 4;mapmonth["May"] = 5;
140     mapmonth["Jun"] = 6;mapmonth["Jul"] = 7;mapmonth["Aug"] = 8;mapmonth["Sep"] = 9;mapmonth["Oct"] = 10;
141     mapmonth["Nov"] = 11;mapmonth["Dec"] = 12;
142     mapweek["Sun"] = 0;mapweek["Mon"] = 1;mapweek["Tue"] = 2;mapweek["Wed"] = 3;mapweek["Thu"] = 4;
143     mapweek["Fri"] = 5;mapweek["Sat"] = 6;
144
145     while(cin>>n>>s>>t)
146     {
147         for(int i=0;i<n;i++)
148         {
149             for(int j=0;j<6;j++)
150             {
151                 cin>>command[i][j];
152             }
153         }
154         for(int i=0;i<n;i++){
155             ///判断分钟
156             judgeNum(minute[i],command[i][0],60);
157             ///判断小时
158             judgeNum(hour[i],command[i][1],25);
159             ///判断每月的天数
160             judgeNum(day[i],command[i][2],32);
161             ///判断月
162             judgeMon(month[i],command[i][3],mapmonth,13);
163             ///判断周
164             judgeMon(week[i],command[i][4],mapweek,7);
165         }
166
167         int y,mon,d,h,min,we;
168
169         __int64 i= s;
170         y = i/100000000;
171         mon = (i/1000000)%100;
172         d = (i/10000)%100;
173         h = (i/100)%100;
174         min = i%100;
175         while(i<t)
176         {
177             we = weekday(y,mon,d);//得到星期几
178             for(int j=0;j<n;j++)
179             {
180                 if(minute[j][min] && hour[j][h] && day[j][d] && month[j][mon] && week[j][we])
181                     printf("%I64d %s\n",i,command[j][5]);
182             }
183
184             if(++min>=60)
185             {
186                 min = 0;
187                 if(++h>=24)
188                 {
189                     h = 0;
190                     if(++d > daysOfMonth(y,mon))
191                     {
192                         d = 1;
193                         if(++mon>12)
194                         {
195                             mon = 1;
196                             ++y;
197                         }
198                     }
199                 }
200             }
201             i = y*1000;
202             i *= 100000;
203             i += mon*1000000 + d*10000 + h*100 + min;
204         }
205
206     }
207     return 0;
208  }

View Code

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 char vMon[][4]={"","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};
  4 char vWek[][4]={"sun","mon","tue","wed","thu","fri","sat"};
  5 int mtharray[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  6 map<string,int> mMon,mWek;
  7 map<string,vector<string> > mrt;
  8 void buildMonAndWekMap()
  9 {
 10     for(int i=1;i<=12;++i) mMon[vMon[i]]=i;//月份
 11     for(int i=0;i<=6;++i) mWek[vWek[i]]=i;//星期
 12 }
 13 string to_string_x(int n)//c++11 surport
 14 {
 15     stringstream ss;
 16     ss<<n;
 17     return ss.str();
 18 }
 19 int stoi_x(const string &str)//c++11 surport
 20 {
 21     int ans;
 22     stringstream ss(str);
 23     ss>>ans;
 24     return ans;
 25 }
 26 void toStandard(string &str)//转化为标准小写
 27 {
 28     int len=str.size();
 29     for(int i=0;i<len;++i)str[i]=tolower(str[i]);
 30 }
 31 vector<string> splitStringAndbuildVector(string &str,int TAG)//TAG=0(other),1(month),2(dayofweek);
 32 {
 33     str+=",";
 34     vector<string> vret;
 35     size_t found=str.find(",");
 36     while(found!=string::npos)
 37     {
 38         string x=str.substr(0,found);
 39         str=str.substr(found+1,str.size()-found-1);
 40         size_t fdx=x.find("-");
 41         if(fdx==string::npos)//非连续值
 42         {
 43             if(TAG==1&&isalpha(x[0])) x=to_string_x(mMon[x]);//是month英文缩写,转换为数字
 44             if(TAG==2&&isalpha(x[0])) x=to_string_x(mWek[x]);//是day of week英文缩写,转换为数字
 45             if(x.size()==1) x="0"+x;//添加0
 46             vret.push_back(x);
 47         }
 48         else//连续值
 49         {
 50             string L=x.substr(0,fdx),R=x.substr(fdx+1,x.size()-fdx-1);
 51             int left,right;
 52             if(TAG==0) left=stoi_x(L),right=stoi_x(R);
 53             else if(TAG==1)//month
 54             {
 55                 left=(isalpha(L[0]))?mMon[L]:stoi_x(L);
 56                 right=(isalpha(R[0]))?mMon[R]:stoi_x(R);
 57             }
 58             else if(TAG==2)//day of week
 59             {
 60                 left=(isalpha(L[0]))?mWek[L]:stoi_x(L);
 61                 right=(isalpha(R[0]))?mWek[R]:stoi_x(R);
 62             }
 63             while(left<=right)
 64             {
 65                 string num=to_string_x(left);
 66                 if(num.size()==1)num="0"+num;
 67                 vret.push_back(num);
 68                 ++left;
 69             }
 70         }
 71         found=str.find(",");
 72     }
 73     return vret;
 74 }
 75 bool isleapyear(int y)
 76 {
 77     return (y%4==0&&y%100)||y%400==0;
 78 }
 79 string getWeekday(string year,string month,string day)
 80 {
 81     int y=stoi_x(year),m=stoi_x(month),d=stoi_x(day);
 82     int by=1970,countday=0;
 83     while(by<y)
 84     {
 85         countday+=(isleapyear(by))?366:365;
 86         ++by;
 87     }
 88     for(int i=1;i<m;++i) countday+=mtharray[i];
 89     countday+=d-1;
 90     return "0"+to_string_x((4+countday%7)%7);
 91 }
 92 int main()
 93 {
 94     int n;
 95     string st,et;
 96     buildMonAndWekMap();
 97     cin>>n>>st>>et;
 98     string syy=st.substr(0,4),smm=st.substr(4,2),sdd=st.substr(6,2),sHH=st.substr(8,2),sMM=st.substr(10,2);
 99     string eyy=et.substr(0,4),emm=et.substr(4,2),edd=et.substr(6,2),eHH=et.substr(8,2),eMM=et.substr(10,2);
100     int syInt=stoi_x(syy),eyInt=stoi_x(eyy);
101     while(n--)
102     {
103         vector<string> vmts,vhur,vdfm,vmth,vdfw;
104         string minutes,hours,dofmon,month,dofwek,command;
105         cin>>minutes>>hours>>dofmon>>month>>dofwek>>command;
106         toStandard(month);//不区别大小写,转化为标准小写
107         toStandard(dofwek);//不区别大小写,转化为标准小写
108         if(minutes=="*") minutes="0-59";
109         vmts=splitStringAndbuildVector(minutes,0);//应该执行的分钟
110         if(hours=="*") hours="0-23";
111         vhur=splitStringAndbuildVector(hours,0); //应该执行的小时
112         if(dofmon=="*") dofmon="1-31";
113         vdfm=splitStringAndbuildVector(dofmon,0);//应该执行的日期
114         if(month=="*") month="1-12";
115         vmth=splitStringAndbuildVector(month,1);//应该执行的月份
116         if(dofwek=="*") dofwek="0-6";
117         vdfw=splitStringAndbuildVector(dofwek,2);//应该周几执行
118         set<string> wekexist;
119         for(size_t i=0;i<vdfw.size();++i) wekexist.insert(vdfw[i]);//更快的检索当前日期(dayofweek)是不是应该执行
120         int curyear=syInt;//从开始年份执行
121         while(curyear<=eyInt)
122         {
123             if(isleapyear(curyear)) mtharray[2]=29;//leapyear的2月份应该是29天
124             else mtharray[2]=28;
125             string year=to_string_x(curyear);//年份
126             for(size_t mi=0;mi<vmth.size();mi++)//month
127             {
128                 string curm=vmth[mi];//当前月份
129                 for(size_t di=0;di<vdfm.size();di++)//day of month
130                 {
131                     string curd=vdfm[di];//当前日期
132                     string wd=getWeekday(year,curm,curd);//该年,该月,该日是星期几
133                     if(wekexist.count(wd)==0||stoi_x(curd)>mtharray[stoi_x(curm)])continue;
134                     //命令行中不包含该星期或者当前天数超过当前月份的应有天数时
135                     for(size_t Hi=0;Hi<vhur.size();++Hi)//hour
136                     {
137                         for(size_t Mi=0;Mi<vmts.size();++Mi)//minutes
138                         {
139                             string datetime=year+curm+curd+vhur[Hi]+vmts[Mi];
140                             if(datetime>=st&&datetime<et) mrt[datetime].push_back(command);//在当前日期时间内
141                         }
142                     }
143                 }
144             }
145             ++curyear;//进入下一年
146         }
147     }
148     for(map<string,vector<string> >::iterator it=mrt.begin();it!=mrt.end();++it)
149     {
150         map<string,int> isprt;
151         for(size_t i=0;i<it->second.size();++i)
152         {
153             string dis=it->first+" "+it->second[i];
154             if(isprt.count(dis)==0)
155             {
156                 cout<<dis<<endl;
157                 isprt[dis]=1;
158             }
159         }
160     }
161     return 0;
162 }

View Code

转载于:https://www.cnblogs.com/yxh-amysear/p/8473626.html

2017-12-3 Crontab(字符串处理)相关推荐

  1. 2017/12/29

    2019独角兽企业重金招聘Python工程师标准>>> 2017/12/29 Firday weather: light rain ! 1.需求: 写一个脚本实现如下功能: 输入一个 ...

  2. poi 公式转 图片_三阶魔方公式符号图解V2.0(2017/12/15)_碧海风云

    本文出自微信公众号[碧海风云]之<三阶魔方公式符号图解V2.0(2017/12/15)_碧海风云> 公式符号概述 英国原伦敦南岸大学数学教授大卫·辛马斯特(David Breyer Sin ...

  3. 2017.12.20 静态网页小实战

    时间:2017.12.20 地点:武汉-学校 项目类型:静态网页-王者荣耀游戏相关网页 制作时间:差不多半个月 主页面html代码: <!doctype html> <html> ...

  4. 抓住窗口期 成就世界级 —— 29周年之际致全体同仁 wwj 2017.12.6

    [企业与公共组织数字化时代,如何做好产品],重点学习老王精神::::: 抓住窗口期  成就世界级 --在用友创立29周年之际致用友全体同仁 WWJ 2017.12.6

  5. deepin efi 启动u盘_【2017.12.16】启动U盘简单手动制作BIOS+UEFI的syslinux/grub/boomgr/grub2互转...

    本帖最后由 lintrainwy 于 2018-1-4 15:05 编辑 文件和方法来源于网上,本人做了整合,方便U盘启动 1.BIOS方式下,这个U盘启动是syslinux 6.03+grub4do ...

  6. 武汉工程科技学院.网络集成与安全.综合实习报告.2017.12.5

    声明:此分享仅供学习参考,不得用于任何商业用途. 武汉工程科技学院.网络集成与安全.综合实习报告.2017.12.5 拓扑图如下: 主要知识点如下: 1)        静态路由 2)         ...

  7. 【2017.12.12】deepin安装U盘制作,支持 BIOS+UEFI,deepin_Recovery+Win PE

    U盘要求为 FAT32,MBR分区表 如果需要放 4GB 大文件,可以分两个分区,第一分区FAT32格式,放启动相关文件,第二个分区用 NTFS 格式,放其它资料. 最新 Win10 支持显示 U盘 ...

  8. OSN博士必须掌握的必杀技(更新至2017/12/15)

    以下内容更新至2017.12.15 概率图模型 1 Representation 11 The Bayesian Network Representation 12 Undirected Graphi ...

  9. switch字符串jdk_从JDK 12删除原始字符串文字

    switch字符串jdk 已经提出从JDK 12中删除原始字符串文字(预览) (它将在12月13日进入Rampdown第一阶段 ). Brian Goetz撰写了删除此预览功能的动机的详细说明 ( J ...

  10. 从JDK 12删除原始字符串文字

    已经提出从JDK 12 (它将在12月13日进入Rampdown第一阶段 )中删除原始字符串文字(预览 ). Brian Goetz撰写了删除此预览功能的动机的详细描述 ( JEP 326 ). 在J ...

最新文章

  1. Android提升篇系列:Android项目代码优化实践
  2. 快速排序 python菜鸟教程-NumPy 排序、条件刷选函数
  3. mysql修行练级之字符集,数据类型与存储引擎选择
  4. hdu3756 三分求最小圆锥
  5. 鑿婂瓙鏇版祴璇曡崏绋縶29C28FD771BA4B0D8693}
  6. 中间表增加额外字段_知识分享 I 这样显示报表筛选字段 你学会了吗
  7. Word 2016加载Endnote x9的方法
  8. JZOJ 5463. 【NOIP2017提高A组冲刺11.8】证书
  9. nginx / 安装、部署和启动
  10. 设计模式学习(三)——单例模式
  11. 一个失败的创意:GPGPU纹理化通用加速kD树的实现
  12. vue vue实例中的data与vue组件中的data()
  13. springboot整合ssm(mybatis)
  14. C++基础之函数的默认参数,什么是函数默认参数?
  15. 记录PHP错误日志 display_errors与log_errors的区别
  16. spring @POSTConstruction注解的作用
  17. 基础线性代数知识点总结与回顾(二):秩与线性相关
  18. 明星隐私倒卖链:只要150 你对朱一龙行踪比他妈还了解
  19. 中兴网信员工坠楼事件背后:程序员中年危机来了?
  20. 微信公众平台开发(1)验证TOKEN源码

热门文章

  1. 雷丰阳spring系列的笔记_怒肝8个月源码,我成为了 Spring 开源贡献者
  2. cookie分号后面没有值_Cookie的属性(cookie的设置、获取和删除)
  3. spark 数据倾斜之两阶段聚合(局部聚合+全局聚合)
  4. clickhouse kafka引擎入门
  5. clickhouse算术函数
  6. hive时间函数入门
  7. BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
  8. 深度学习之神经网络核心原理与算法-caffekeras框架图片分类
  9. sql去某几个字段重复的记录
  10. innodb_lru_scan_depth