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对象的方法有 ...
随机推荐
- 1.SpringMVC 概述
SpringMVC 简介 SpringMVC 也叫 Spring web mvc ,属于表现层的框架.SpringMVC 是 Spring框架的一部分,是在Spring3.0后发布的 第一个Sprin ...
- 如何创建一个前端 React 组件并发布到 NPM
首先npm文档摆在这里: https://www.npmjs.cn/ 参考组件 https://github.com/rakuten-rex/rex-dropdownhttps://www.npmjs ...
- Golang等待一组协程结束
1. 利用waitgroup import ( "log" "sync" "sync/atomic" "time" ) ...
- exec sp_executesql 比直接执行SQL慢,而且消耗大量资源问题
今天SqlServer数据库出现了访问不通的情况,抓紧重启了下服务,让大家先恢复使用,然后我开了 SQL Server Profiler 看看是不是存在性能问题SQL,然后就发现一批这样的SQL,看r ...
- JDBC下
存储过程名字前面一定要加一个sp,代表是存储过程 nofilter:没有过滤器,没有参数 )) BEGIN IF sp_name IS NULL OR sp_name='' THEN SELECT * ...
- [SDOI2010]代码拍卖会——DP
原题戳这里 绝对是一道好题 需要注意到两个东西 1.符合条件的数可以拆成一堆\(11...11\)相加的形式,比如\(1145=1111+11+11+11+1\) 2.\(1,11,111,1111, ...
- mysql 密码重置或忘记密码相关命令
方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...
- Educational Codeforces Round 73 (Rated for Div. 2) D. Make The Fence Great Again(DP)
链接: https://codeforces.com/contest/1221/problem/D 题意: You have a fence consisting of n vertical boar ...
- Maven简介、安装、配置
1.Maven是什么? Maven是一种跨平台的项目管理工具,是一个开源的项目,主要服务于基于java平台的项目构建.依赖管理和项目信息管理.Maven还提供了中央仓库,能帮助我们自动的下载构件.Ma ...
- CSS 图片自适应容器
https://www.jb51.net/css/660677.html 经常有这样一个场景,需要让图片自适应容器的大小. 1.img标签的方式 我们马上就能想到,把width.height 设置为1 ...