2017-12-3 Crontab(字符串处理)
Crontab
哈哈本人的不及格代码(暂留):
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<cstring>
using namespace std;
int n;
__int64 s,t;
char command[][][]; map<string,int> mapmonth;
map<string,int> mapweek; bool month[][];
bool week[][];
bool minute[][];
bool hour[][];
bool day[][]; void judgeMon(bool* mon,char *tm,map<string,int> mymap,int len)
{///判断月或是周是否符合条件
if(tm[]=='*'){
memset(mon,true,len);
return;
}
for(int i=;i<strlen(tm);)
{
if(tm[i] == ',') i++;
///如果是数字的话
int mon1 = ;
while(''<=tm[i] && tm[i]<='')
{
mon1 = mon1* + tm[i++]-'';
}
///如果是字母的话
char monstr[];int temp = ;bool flag = false;
while('A'<=tm[i]&&tm[i]<='Z' || 'a'<=tm[i]&&tm[i]<='z')
{
monstr[temp++] = tm[i++];
flag = true;
}
monstr[temp] = '\000';
if(flag) mon1 = mymap[monstr]; mon[mon1] = true; if(tm[i] == ',') i++;
else if(tm[i]=='-')
{
i++;
///如果是数字的话
int mon2 = ;
while(''<=tm[i] && tm[i]<='')
{
mon2 =mon2* + tm[i++]-'';
} ///如果是字母的话
int temp = ;flag = false;
while('A'<=tm[i]&&tm[i]<='Z' || 'a'<=tm[i]&&tm[i]<='z'){
monstr[temp++] = tm[i++];
flag = true;
}
monstr[temp] = '\000';
if(flag) mon2 = mymap[monstr];
for(int k=mon1;k<=mon2;k++)
mon[k] = true;
}
}
}
void judgeNum(bool *mon,char *tm,int len)
{
if(tm[]=='*')
{
memset(mon,true,len);
return;
}
for(int i=;i<strlen(tm);)
{
if(tm[i] == ',') i++;
///如果是数字的话
int mon1 = ;
while(''<=tm[i] && tm[i]<='')
{
mon1 = mon1* + tm[i++]-'';
} mon[mon1] = true; if(tm[i] == ',') i++;
else if(tm[i]=='-')
{
i++;
///如果是数字的话
int mon2 = ;
while(''<=tm[i] && tm[i]<='')
{
mon2 =mon2* + tm[i++]-'';
} for(int k=mon1;k<=mon2;k++)
mon[k] = true;
}
}
} ///年月日推算星期几
int weekday(int N, int M, int d)
{
int m, n, c, y, w;
m = (M - ) % ;
if (M >= ) n = N; else n = N - ;
c = n / ;
y = n % ;
w = (int)(d + floor( * m / ) + y + floor(y / ) + floor(c / ) - * c) % ;
while (w<) w += ;
return w;
}
bool isleapyear(int y)
{
return (y%==&&y%)||y%==;
} int daysOfMonth(int yy,int mm)
{
if(mm == || mm== || mm== || mm== || mm== || mm== || mm==) return ;
if(mm== || mm== || mm== || mm==) return ;
if(mm == )
{
if(isleapyear(yy)) return ;
else return ;
}
return ;
} int main()
{
mapmonth["Jan"] = ;mapmonth["Feb"] = ;mapmonth["Mar"] = ;mapmonth["Apr"] = ;mapmonth["May"] = ;
mapmonth["Jun"] = ;mapmonth["Jul"] = ;mapmonth["Aug"] = ;mapmonth["Sep"] = ;mapmonth["Oct"] = ;
mapmonth["Nov"] = ;mapmonth["Dec"] = ;
mapweek["Sun"] = ;mapweek["Mon"] = ;mapweek["Tue"] = ;mapweek["Wed"] = ;mapweek["Thu"] = ;
mapweek["Fri"] = ;mapweek["Sat"] = ; while(cin>>n>>s>>t)
{
for(int i=;i<n;i++)
{
for(int j=;j<;j++)
{
cin>>command[i][j];
}
}
for(int i=;i<n;i++){
///判断分钟
judgeNum(minute[i],command[i][],);
///判断小时
judgeNum(hour[i],command[i][],);
///判断每月的天数
judgeNum(day[i],command[i][],);
///判断月
judgeMon(month[i],command[i][],mapmonth,);
///判断周
judgeMon(week[i],command[i][],mapweek,);
} int y,mon,d,h,min,we; __int64 i= s;
y = i/;
mon = (i/)%;
d = (i/)%;
h = (i/)%;
min = i%;
while(i<t)
{
we = weekday(y,mon,d);//得到星期几
for(int j=;j<n;j++)
{
if(minute[j][min] && hour[j][h] && day[j][d] && month[j][mon] && week[j][we])
printf("%I64d %s\n",i,command[j][]);
} if(++min>=)
{
min = ;
if(++h>=)
{
h = ;
if(++d > daysOfMonth(y,mon))
{
d = ;
if(++mon>)
{
mon = ;
++y;
}
}
}
}
i = y*;
i *= ;
i += mon* + d* + h* + min;
} }
return ;
}
#include <bits/stdc++.h>
using namespace std;
char vMon[][]={"","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};
char vWek[][]={"sun","mon","tue","wed","thu","fri","sat"};
int mtharray[]={,,,,,,,,,,,,};
map<string,int> mMon,mWek;
map<string,vector<string> > mrt;
void buildMonAndWekMap()
{
for(int i=;i<=;++i) mMon[vMon[i]]=i;//月份
for(int i=;i<=;++i) mWek[vWek[i]]=i;//星期
}
string to_string_x(int n)//c++11 surport
{
stringstream ss;
ss<<n;
return ss.str();
}
int stoi_x(const string &str)//c++11 surport
{
int ans;
stringstream ss(str);
ss>>ans;
return ans;
}
void toStandard(string &str)//转化为标准小写
{
int len=str.size();
for(int i=;i<len;++i)str[i]=tolower(str[i]);
}
vector<string> splitStringAndbuildVector(string &str,int TAG)//TAG=0(other),1(month),2(dayofweek);
{
str+=",";
vector<string> vret;
size_t found=str.find(",");
while(found!=string::npos)
{
string x=str.substr(,found);
str=str.substr(found+,str.size()-found-);
size_t fdx=x.find("-");
if(fdx==string::npos)//非连续值
{
if(TAG==&&isalpha(x[])) x=to_string_x(mMon[x]);//是month英文缩写,转换为数字
if(TAG==&&isalpha(x[])) x=to_string_x(mWek[x]);//是day of week英文缩写,转换为数字
if(x.size()==) x=""+x;//添加0
vret.push_back(x);
}
else//连续值
{
string L=x.substr(,fdx),R=x.substr(fdx+,x.size()-fdx-);
int left,right;
if(TAG==) left=stoi_x(L),right=stoi_x(R);
else if(TAG==)//month
{
left=(isalpha(L[]))?mMon[L]:stoi_x(L);
right=(isalpha(R[]))?mMon[R]:stoi_x(R);
}
else if(TAG==)//day of week
{
left=(isalpha(L[]))?mWek[L]:stoi_x(L);
right=(isalpha(R[]))?mWek[R]:stoi_x(R);
}
while(left<=right)
{
string num=to_string_x(left);
if(num.size()==)num=""+num;
vret.push_back(num);
++left;
}
}
found=str.find(",");
}
return vret;
}
bool isleapyear(int y)
{
return (y%==&&y%)||y%==;
}
string getWeekday(string year,string month,string day)
{
int y=stoi_x(year),m=stoi_x(month),d=stoi_x(day);
int by=,countday=;
while(by<y)
{
countday+=(isleapyear(by))?:;
++by;
}
for(int i=;i<m;++i) countday+=mtharray[i];
countday+=d-;
return ""+to_string_x((+countday%)%);
}
int main()
{
int n;
string st,et;
buildMonAndWekMap();
cin>>n>>st>>et;
string syy=st.substr(,),smm=st.substr(,),sdd=st.substr(,),sHH=st.substr(,),sMM=st.substr(,);
string eyy=et.substr(,),emm=et.substr(,),edd=et.substr(,),eHH=et.substr(,),eMM=et.substr(,);
int syInt=stoi_x(syy),eyInt=stoi_x(eyy);
while(n--)
{
vector<string> vmts,vhur,vdfm,vmth,vdfw;
string minutes,hours,dofmon,month,dofwek,command;
cin>>minutes>>hours>>dofmon>>month>>dofwek>>command;
toStandard(month);//不区别大小写,转化为标准小写
toStandard(dofwek);//不区别大小写,转化为标准小写
if(minutes=="*") minutes="0-59";
vmts=splitStringAndbuildVector(minutes,);//应该执行的分钟
if(hours=="*") hours="0-23";
vhur=splitStringAndbuildVector(hours,); //应该执行的小时
if(dofmon=="*") dofmon="1-31";
vdfm=splitStringAndbuildVector(dofmon,);//应该执行的日期
if(month=="*") month="1-12";
vmth=splitStringAndbuildVector(month,);//应该执行的月份
if(dofwek=="*") dofwek="0-6";
vdfw=splitStringAndbuildVector(dofwek,);//应该周几执行
set<string> wekexist;
for(size_t i=;i<vdfw.size();++i) wekexist.insert(vdfw[i]);//更快的检索当前日期(dayofweek)是不是应该执行
int curyear=syInt;//从开始年份执行
while(curyear<=eyInt)
{
if(isleapyear(curyear)) mtharray[]=;//leapyear的2月份应该是29天
else mtharray[]=;
string year=to_string_x(curyear);//年份
for(size_t mi=;mi<vmth.size();mi++)//month
{
string curm=vmth[mi];//当前月份
for(size_t di=;di<vdfm.size();di++)//day of month
{
string curd=vdfm[di];//当前日期
string wd=getWeekday(year,curm,curd);//该年,该月,该日是星期几
if(wekexist.count(wd)==||stoi_x(curd)>mtharray[stoi_x(curm)])continue;
//命令行中不包含该星期或者当前天数超过当前月份的应有天数时
for(size_t Hi=;Hi<vhur.size();++Hi)//hour
{
for(size_t Mi=;Mi<vmts.size();++Mi)//minutes
{
string datetime=year+curm+curd+vhur[Hi]+vmts[Mi];
if(datetime>=st&&datetime<et) mrt[datetime].push_back(command);//在当前日期时间内
}
}
}
}
++curyear;//进入下一年
}
}
for(map<string,vector<string> >::iterator it=mrt.begin();it!=mrt.end();++it)
{
map<string,int> isprt;
for(size_t i=;i<it->second.size();++i)
{
string dis=it->first+" "+it->second[i];
if(isprt.count(dis)==)
{
cout<<dis<<endl;
isprt[dis]=;
}
}
}
return ;
}
2017-12-3 Crontab(字符串处理)的更多相关文章
- 2017.12.21-JQuery
作业:密码加强验证 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- Gitlab一键端的安装汉化及问题解决(2017/12/14目前版本为10.2.4)
Gitlab的安装汉化及问题解决 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样... ... 装完之后感觉太简单,加了汉化补丁 ...
- 【2017.12.12】deepin安装U盘制作,支持 BIOS+UEFI,deepin_Recovery+Win PE
U盘要求为 FAT32,MBR分区表 如果需要放 4GB 大文件,可以分两个分区,第一分区FAT32格式,放启动相关文件,第二个分区用 NTFS 格式,放其它资料. 最新 Win10 支持显示 U盘 ...
- 2017.12.25 Mybatis物理分页插件PageHelper的使用(二)
参考来自: 官方文档的说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md 上篇博客 ...
- Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化
ylbtech-Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化 1.返回顶部 1. Java 实例 - 字符串优化 Java 实例 以下实例演示了通过 Str ...
- java一周学习记录(2017/12/2)
姓名:Danny 日期:2017/12/2 周日 周一 周二 周三 周四 周五 周六 所花时间 120 150 190 150 180 28 ...
- 2017.12.20 Java中的 IO/XML学习总结 File类详细
IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...
- Microsoft ACE OLEDB 12.0 数据库连接字符串
Excel 97-2003 Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myOldExcelFile.xls;Extended ...
- 第12章 Java字符串
1.什么是Java中的字符串 字符串String并不是一种数据类型,而是一个类对象,在java.lang包中,只不过在默认情况下java都是自动导入的,所以可以直接使用创建一个String对象的方法有 ...
随机推荐
- 利用axis调用webservice接口
一.首先把wsdl文件放入eclipse中某个项目中的src目录下 二.右键弹出webservice,然后点击webservice菜单,选中genernator client ,选择axis生成Jav ...
- Hexo NexT主题内加入动态背景
主题内新添加内容 _layout.swig 找到themes\next\layout\_layout.swig文件,添加内容:在<body>里添加: 1 2 3 <div class ...
- python 判断两个ip地址是否属于同一子网
python 判断两个ip地址是否属于同一子网 """ 判断两个IP是否属于同一子网, 需要判断网络地址是否相同 网络地址:IP地址的二进制与子网掩码的二进制地址逻辑&q ...
- 五、DDL语言
目录 简介 库的管理: 表的管理: 命令: 库的管理 创建 修改(一旦创建库,一般不修改) 删除 表的管理 创建 修改 删除 复制 常见约束 含义 分类 标识列(自增长列) 简介 DDL:数据定义语言 ...
- OpenJudge POJ C19C 贪心
https://cn.vjudge.net/contest/309482#problem/C #include<bits/stdc++.h> using namespace std; ty ...
- Python 列出 windows 安装的软件
Python 列出 windows 安装的软件 参考链接:https://stackoverflow.com/questions/802499/how-can-i-enumerate-list-all ...
- Beego框架POST请求接收JSON数据
原文: https://blog.csdn.net/Aaron_80726/article/details/83870563 ------------------------------------- ...
- VMware厚置备延迟置零,厚置备置零,精简置备详解
1.厚置备延迟置零(zeroed thick) 以默认的厚格式创建虚拟磁盘.创建过程中为虚拟磁盘分配所需空间.创建时不会擦除物理设备上保留的任何数据,但是以后从虚拟机首次执行写操作时会按需要将其置零. ...
- vuex直接修改state 与 用commit提交mutation来修改state的差异
一. 使用vuex修改state时,有两种方式: 1)可以直接使用 this.$store.state.变量 = xxx; 2)this.$store.dispatch(actionType, pa ...
- windows下多个python版本共存 及安装Django
了解python的人都知道python有2.x版本和3.x版本,而python3.x版本不向下兼容,但是根据具体的需要,有时候要2.x和3.x共存,python共存本身没有问题,只是需要设置一些环境变 ...