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(字符串处理)的更多相关文章

  1. 2017.12.21-JQuery

    作业:密码加强验证 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...

  2. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

  3. Gitlab一键端的安装汉化及问题解决(2017/12/14目前版本为10.2.4)

    Gitlab的安装汉化及问题解决 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样... ... 装完之后感觉太简单,加了汉化补丁 ...

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

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

  5. 2017.12.25 Mybatis物理分页插件PageHelper的使用(二)

    参考来自: 官方文档的说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md 上篇博客 ...

  6. Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化

    ylbtech-Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化 1.返回顶部 1. Java 实例 - 字符串优化  Java 实例 以下实例演示了通过 Str ...

  7. java一周学习记录(2017/12/2)

    姓名:Danny                               日期:2017/12/2 周日 周一 周二 周三 周四 周五 周六 所花时间 120 150 190 150 180 28 ...

  8. 2017.12.20 Java中的 IO/XML学习总结 File类详细

    IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...

  9. Microsoft ACE OLEDB 12.0 数据库连接字符串

    Excel 97-2003 Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myOldExcelFile.xls;Extended ...

  10. 第12章 Java字符串

    1.什么是Java中的字符串 字符串String并不是一种数据类型,而是一个类对象,在java.lang包中,只不过在默认情况下java都是自动导入的,所以可以直接使用创建一个String对象的方法有 ...

随机推荐

  1. 【python】python _、__、__xx__之间的差别

    本文来自 yzl11 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yzl11/article/details/53792416?utm_source=copy 单下 ...

  2. 【坑】Spring中抽象父类属性注入,子类调用父类方法使用父类注入属性

    运行环境 idea 2017.1.1 spring 3.2.9.RELEASE 需求背景 需要实现一个功能,该功能有2个场景A.B,大同小异 抽象一个抽象基类Base,实现了基本相同的方法BaseMe ...

  3. Django Setting文件配置和简单的创建数据库字段

    Django Settings文件配置 静态文件配置 STATIC_URL = '/static/' # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_D ...

  4. python基础:流程控制案例:

    1,简述编译型与解释型的语言,且分别列出你知道的哪些语言属于编译型,哪些属于解释型. 答:简单理解编译型语言类似谷歌翻译,整篇读入整篇翻译,代表语言有C语言,解释型语言类似同   声传译,读入一行翻译 ...

  5. 8. Object References, Mutability, and Recycling

    1. Variables Are Not Boxes # Think variables as sticky notes a = [1, 2, 3] b = a a.append(4) print b ...

  6. linux——在windows上搭建linux练习环境

    程序员自己研究——java-linux-php——环境搭建 需要首选准备一个linux环境. 1,可用安装一个虚拟机:VMware虚拟机 2,安装一个VMware大约5分钟左右. 3,截止目前2019 ...

  7. hdu4786 Fibonacci Tree[最小生成树]【结论题】

    一道结论题:如果最小生成树和最大生成树之间存在fib数,成立.不存在或者不连通则不成立.由于是01图,所以这个区间内的任何生成树都存在. 证明:数学归纳?如果一棵树没有办法再用非树边0边替代1边了,那 ...

  8. Call JMS Web Service

    The content type application/json of the response message does not match the content type of the bin ...

  9. Intel Wireless AC9560 160MHZ 联网黄色感叹号的问题

    Intel Wireless 开始支持5G设备了,AC9560 160MHZ可以工作在5G模式了.新入的设备驱动程序升级到了最新版本,发现联网出现“黄色感叹号”,DHCP的IP地址获取正常,从无线路由 ...

  10. 收藏一个ST表模板

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...