[CSP]201712-3 Crontab(気持ち悪い)string処理大シミュレーション
8191 ワード
タイトルリンク:http://118.190.20.162/view.page?gpid=T66
私よりきれいに書かれたコードを貼ってください.https://blog.csdn.net/banana_cjb/article/details/79174688
どのように書くかを事前に計画しないか、C++のstringを使わないか、コードを書くときに心が足りないか、処理するのは気持ち悪いと言わざるを得ません.だから試験の時に必ず簡単な部分を書かなければなりません.そうしないと、この問題の価格は低いです.特に細かいことを間違えると、100行以上のコードを20点書くことができます.
私が直面した問題:
1.配列の下付き文字が間違っています.コード能力によるものです.
2.erase書き間違えました.多重ループなので、ループをスキップするには文字列を処理する必要があります.だから、事前にどのように書くかを計画することが大切です.途中で変えないでください.
3.日付数が間違っている.これは気まずいです.ある月がこの1年で何日経ったか、つまり31.2.3.3.30...の接頭辞配列を1つの配列で覚えました.しかし、私は計算を間違えて、40点も足りなかった.
4.間違った問題を見て、肝心な細部を無視する.まずJunという表現は、大文字も小文字も可能です.最後の15分は他の人のコードを見てやっと間違っていることに気づいた.そしてデータ範囲は左閉右開です.
5.整数と文字列変換の問題.Javaとは異なり、ここのstringは整数をつなぎ合わせ、+プラス記号や直接構造することはできません.そうしないと、奇妙な結果が発生します.次に整数回転文字列は、補位の問題に注意することができます.
6.合法的なデータの追加判断.4月31日、閏年でない2月29日などのデータは除外します.
それからstringのいくつかの使い方:
1.size()とlength()です.文字列の長さを取得します.sizeは他のSTLに等しく、lengthはstringでちょうど同義語であり、どちらを使ってもよいということです.
2.at()と[]です.ある位置を取得する要素はat(i)後者で直接下付きでアクセスできる.
3.+とappend.つなぎ合わせるのに使います.appendは、別の文字のサブストリング(string str,int pos,int len)を追加したり、同じ文字(int time,char ch)を複数追加したりすることができます.
4.erase.posから始まるlenの長さを削除するための文字(int pos,int len).または、1つまたは2つの反復器間の文字を削除します.
5.find.文字列内の文字/列が初めて現れる場所を検索するために使用され、nposは返されません.(str/char,pos=0).
6.substr.ある文字列がposから始まり、長さlenのサブ列を返します.
7.replace.ある文字列をposから長さlenの列に置き換えます.(pos, len, string newstr)
次に、処理ロジック:各命令にはstringタイプのvectorが5つ格納され、その正当分、時間、日、月、週の2つの文字列がそれぞれ記録されます.すべての合法的なグループを遍歴して見つけ、週と範囲で命令かどうかを判断し、つなぎ合わせた文字列を保存し、最後にソートによって時間順の命令セットを得る.
データ処理:
1.WeekとMonthの英語列を数字に置き換えます.2つの配列で遍歴して探せばいいです.
2.表示される可能性のある数字を2桁の文字列に置き換えます.補位の問題があるかもしれません.
3.処理*.*の場合は、範囲内のすべての数をvectorに捨てます.
4.そうでなければステップごとに処理を繰り返し、
5.一組の区切られた解を処理するとき、あるか否かを判断する-、ある場合は整数を変換して範囲内のすべての数をvectorに投げ込み、そうでない場合は全体をvectorに投げ込む.
遍歴判断:
1.5重ループ(年、月、日、時、分)の綴り文字列により、綴りながら範囲を超えているか否かを判断し、strを修正するcontinueを超える.
2.遍歴する前に判断し、重複データの挿入を避ける(理論的にはできない)
3.最内層まで歩いたとき.特殊な不法な日付を削除します.週間を計算して、合法的かどうかを調べます.vectorでは、削除していなければ.
私よりきれいに書かれたコードを貼ってください.https://blog.csdn.net/banana_cjb/article/details/79174688
どのように書くかを事前に計画しないか、C++のstringを使わないか、コードを書くときに心が足りないか、処理するのは気持ち悪いと言わざるを得ません.だから試験の時に必ず簡単な部分を書かなければなりません.そうしないと、この問題の価格は低いです.特に細かいことを間違えると、100行以上のコードを20点書くことができます.
私が直面した問題:
1.配列の下付き文字が間違っています.コード能力によるものです.
2.erase書き間違えました.多重ループなので、ループをスキップするには文字列を処理する必要があります.だから、事前にどのように書くかを計画することが大切です.途中で変えないでください.
3.日付数が間違っている.これは気まずいです.ある月がこの1年で何日経ったか、つまり31.2.3.3.30...の接頭辞配列を1つの配列で覚えました.しかし、私は計算を間違えて、40点も足りなかった.
4.間違った問題を見て、肝心な細部を無視する.まずJunという表現は、大文字も小文字も可能です.最後の15分は他の人のコードを見てやっと間違っていることに気づいた.そしてデータ範囲は左閉右開です.
5.整数と文字列変換の問題.Javaとは異なり、ここのstringは整数をつなぎ合わせ、+プラス記号や直接構造することはできません.そうしないと、奇妙な結果が発生します.次に整数回転文字列は、補位の問題に注意することができます.
6.合法的なデータの追加判断.4月31日、閏年でない2月29日などのデータは除外します.
それからstringのいくつかの使い方:
1.size()とlength()です.文字列の長さを取得します.sizeは他のSTLに等しく、lengthはstringでちょうど同義語であり、どちらを使ってもよいということです.
2.at()と[]です.ある位置を取得する要素はat(i)後者で直接下付きでアクセスできる.
3.+とappend.つなぎ合わせるのに使います.appendは、別の文字のサブストリング(string str,int pos,int len)を追加したり、同じ文字(int time,char ch)を複数追加したりすることができます.
4.erase.posから始まるlenの長さを削除するための文字(int pos,int len).または、1つまたは2つの反復器間の文字を削除します.
5.find.文字列内の文字/列が初めて現れる場所を検索するために使用され、nposは返されません.(str/char,pos=0).
6.substr.ある文字列がposから始まり、長さlenのサブ列を返します.
7.replace.ある文字列をposから長さlenの列に置き換えます.(pos, len, string newstr)
次に、処理ロジック:各命令にはstringタイプのvectorが5つ格納され、その正当分、時間、日、月、週の2つの文字列がそれぞれ記録されます.すべての合法的なグループを遍歴して見つけ、週と範囲で命令かどうかを判断し、つなぎ合わせた文字列を保存し、最後にソートによって時間順の命令セットを得る.
データ処理:
1.WeekとMonthの英語列を数字に置き換えます.2つの配列で遍歴して探せばいいです.
2.表示される可能性のある数字を2桁の文字列に置き換えます.補位の問題があるかもしれません.
3.処理*.*の場合は、範囲内のすべての数をvectorに捨てます.
4.そうでなければステップごとに処理を繰り返し、
5.一組の区切られた解を処理するとき、あるか否かを判断する-、ある場合は整数を変換して範囲内のすべての数をvectorに投げ込み、そうでない場合は全体をvectorに投げ込む.
遍歴判断:
1.5重ループ(年、月、日、時、分)の綴り文字列により、綴りながら範囲を超えているか否かを判断し、strを修正するcontinueを超える.
2.遍歴する前に判断し、重複データの挿入を避ける(理論的にはできない)
3.最内層まで歩いたとき.特殊な不法な日付を削除します.週間を計算して、合法的かどうかを調べます.vectorでは、削除していなければ.
#include
#include
#include
#include
#include
#include
using namespace std;
const string Months[] = {" ", "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};
const string Weekdays[] = {"sun", "mon", "tue", "wed", "thu", "fri", "sat"};
const int Dnum[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
string sttime, edtime;// ,
typedef struct Ans
{
string time, work;
}Ans;
vectorans;// , 。
bool cmp(const Ans &a, const Ans &b)
{
return a.time < b.time;
}
class Order
{
vector mm, hh, DD, MM, Wek;
string work;
void init()
{
mm.clear(), hh.clear(), DD.clear(), MM.clear(), Wek.clear();
}
//----------- string int --------------
int stoi(string str)
{
//cout<"<= 'A')oldstr[i] = oldstr[i] - 'A' + 'a';
while((pos=oldstr.find(old_value))!=string::npos) {
oldstr = oldstr.replace(pos,old_value.size(),new_value);
}
return oldstr;
}
//------------ 5 。 , vector 。
void convMin(string str)
{
string strn;
string pb;
if(str == "*"){
for(int i = 0; i < 60; i++){pb = itos(i); mm.push_back(pb);}
}
else {
while(str != ""){
int pos;
if((pos = str.find(',')) != string::npos){
strn = str.substr(0, pos);
str = str.substr(pos+1, str.size() - pos);}
else {strn = str; str = "";}
int posn;
if((posn = strn.find('-')) != string::npos){
string left = strn.substr(0, posn);
int il = stoi(left);
string right = strn.substr(posn+1, strn.size()-posn);
int ir = stoi(right);
for(int i = il; i <= ir; i++){pb = itos(i); mm.push_back(pb);}
}
else mm.push_back(itos(stoi(strn)));
}
}
/*cout< 2)ans++;
ans %= 7;
ans += day-1;
ans %= 7;
return ans;
}
// ans
void getAns()
{
string str;
sort(mm.begin(), mm.end());
sort(hh.begin(), hh.end());
sort(DD.begin(), DD.end());
sort(MM.begin(), MM.end());
sort(Wek.begin(), Wek.end());
for(int y = stoi(sttime.substr(0, 4)); y <= stoi(edtime.substr(0, 4)); y++){
for(int l = 0; l < MM.size(); l++){
if(l > 0 && MM[l] == MM[l-1]){str.erase(4, 2);continue;}
str = itos(y) + MM[l];
if(str < sttime.substr(0, 6) || str > edtime.substr(0, 6)){str.erase(4, 2);continue;}
for(int k = 0; k < DD.size(); k++)
{
str = itos(y) + MM[l] + DD[k];
if(k > 0 && DD[k] == DD[k-1]){str.erase(6, 2);continue;}
if(str < sttime.substr(0, 8) || str > edtime.substr(0, 8)){str.erase(6, 2);continue;}
for(int j = 0; j < hh.size(); j++){
if(j > 0 && hh[j] == hh[j-1]){str.erase(8, 2);continue;}
str = itos(y) + MM[l] + DD[k] + hh[j];
if(str < sttime.substr(0, 10) || str > edtime.substr(0, 10)){str.erase(8, 2);continue;}
for(int i = 0; i < mm.size(); i++){
if(i > 0 && mm[i] == mm[i-1]){str.erase(10, 2);continue;}//
if(DD[k] == "31" && (MM[l] == "04" || MM[l] == "06" || MM[l] == "09" || MM[l] == "11" || MM[l] == "02")){str.erase(10, 2);continue;}//
if(MM[l] == "02" && (DD[k] == "30" || (DD[k] == "29" && !luyear(y)))){str.erase(10, 2);continue;}
str = itos(y) + MM[l] + DD[k] + hh[j]+ mm[i] + '\0';
if(str < sttime.substr(0, 12) || str >= edtime.substr(0, 12)){str.erase(10, 2);continue;} //
int gwed = getWeekday(str);
string sgwed = itos(gwed);
bool flag = false;
for(int m = 0; m < Wek.size(); m++){//
if(Wek[m] == sgwed)flag = true;
}
if(flag == false){str.erase(10, 2);continue;}
Ans now;
now.time = str, now.work = work;ans.push_back(now);
str.erase(10, 2);
}
str.erase(8, 2);
}
str.erase(6, 2);
}
str.erase(4, 2);
}
str = "";
}
}
public:
Order(string a, string b, string c, string d, string e, string f)//
{
init();
work = f;
convMin(a);
convHour(b);
convDay(c);
convMon(d);
convWek(e);
getAns();
}
};
int main()
{
ans.clear();
int n;
cin>>n>>sttime>>edtime;
string a, b, c, d, e, w;
for(int i = 0; i < n; i++)
{
cin>>a>>b>>c>>d>>e>>w;
Order *ord = new Order(a, b, c, d, e, w);
}
sort(ans.begin(), ans.end(), cmp);// 。
for(int i = 0; i < ans.size(); i++)
{
cout<