有6條配置命令,它們執行的結果分別是:
| 命 令 | 執 行 |
| reset | reset what |
| reset board | board fault |
| board add | where to add |
| board delet | no board at all |
| reboot backplane | impossible |
| backplane abort | install first |
| he he | unkown command |
注意:he he不是命令。
為了簡化輸入,方便用戶,以“最短唯一匹配原則”匹配:1、若只輸入一字串,則只匹配一個關鍵字的命令行。例如輸入:r,根據該規則,匹配命令reset,執行結果為:reset what;輸入:res,根據該規則,匹配命令reset,執行結果為:reset what;2、若只輸入一字串,但本條命令有兩個關鍵字,則匹配失敗。例如輸入:reb,可以找到命令reboot backpalne,但是該命令有兩個關鍵詞,所有匹配失敗,執行結果為:unkown command3、若輸入兩字串,則先匹配第一關鍵字,如果有匹配但不唯一,繼續匹配第二關鍵字,如果仍不唯一,匹配失敗。例如輸入:r b,找到匹配命令reset board,執行結果為:board fault。
4、若輸入兩字串,則先匹配第一關鍵字,如果有匹配但不唯一,繼續匹配第二關鍵字,如果唯一,匹配成功。例如輸入:b a,無法確定是命令board add還是backplane abort,匹配失敗。5、若輸入兩字串,第一關鍵字匹配成功,則匹配第二關鍵字,若無匹配,失敗。例如輸入:bo a,確定是命令board add,匹配成功。6、若匹配失敗,打印“unkown command”
多行字符串,每行字符串一條命令
輸出描述:
執行結果,每條命令輸出一行
輸入例子:
resetreset boardboard addboard deletreboot backplanebackplane abort輸出例子:
reset whatboard faultwhere to addno board at allimpossibleinstall first本來是道好題,出題人先是描述有誤(規則描述沒有問題,但是舉得例子有錯誤),然后"unknown command"被出題人拼成了"unkown command"。。也是醉了。不過增加一點OJ經驗就是:當發現你的答案被中間截斷時,則說明從截斷的最后一個打印出來的用例開始出錯,可能是特殊情況未考慮導致某個用例出錯或輸出格式不對。
我的思路:用map存放命令的對應關系(用兩個vector<string>對應存放其實更簡單),匹配時要分情況:輸入只有一個關鍵字的則只匹配1個關鍵字的命令,兩個關鍵字的則只匹配2個關鍵字的命令,并且先匹配第一個再匹配第二個。
具體匹配的思路是:以匹配第一個關鍵字為例,獲取輸入命令第一個關鍵字的長度,對匹配集的每個命令取子串(substr)比較,子串從0開始取且長度為輸入關鍵字的長度,若相等則匹配。注意:不是簡單的調用string::find(),因為該函數查找所有可能的子串,但是命令匹配必須從開頭位置開始取子串,比如輸入"bo a" ,如果直接find(),第一個關鍵字會匹配到三個結果:"board add"、"board delet"、"reboot backplane",然后實際上只應該匹配到前兩個結果然后再去匹配第二個關鍵字。原因是string::find()會匹配所有可能的子串,第三個結果中的''reboot'里確實出現了"bo",但是很顯然這個結果不是正確的匹配結果。
匹配兩個關鍵字的命令時需要特別注意:第二個關鍵字的匹配要在第一個關鍵字匹配成功的結果集中繼續匹配。
因此用了兩個vector<pair<string,string>> 型的firstRes和secondRes來存放第二次查找的結果集,如果唯一則匹配成功,不唯一則失敗。
代碼注釋很詳細,沒有用技巧,硬匹配。完整AC代碼:
#include <iostream>#include <sstream>#include <vector>#include <map>#include <algorithm>using namespace std;//splitvector<string> split(string str, char sep){ stringstream stream(str); string temp; vector<string> res; while(getline(stream, temp, sep)){ res.push_back(temp); } return res;}void findConfigCmd(string str,string &res){ map<string,string> doubleCmds; doubleCmds.insert(make_pair("reset board","board fault")); doubleCmds.insert(make_pair("board add","where to add")); doubleCmds.insert(make_pair("board delet","no board at all")); doubleCmds.insert(make_pair("reboot backplane","impossible")); doubleCmds.insert(make_pair("backplane abort","install first")); vector<string> inputCmd=split(str,' '); if(inputCmd.size()==1){//只匹配一個關鍵字的命令(只有第一個) string temp("reset"); if(inputCmd[0]==temp.substr(0,inputCmd[0].size())){ res="reset what"; } else{ res="unkown command"; } } else{ vector<pair<string,string> > cmdKeys={ make_pair("reset", "board"), make_pair("board","add"), make_pair("board","delet"), make_pair("reboot","backplane"), make_pair("backplane","abort") }; vector<pair<string,string> > firstRes,secondRes;//關鍵字匹配的結果集 int size1=inputCmd[0].size(); int size2=inputCmd[1].size(); for(int i=0;i<cmdKeys.size();i++){//匹配第一個關鍵字 if(inputCmd[0]==cmdKeys[i].first.substr(0,size1)){ firstRes.push_back(cmdKeys[i]); } } if(firstRes.size()==0){//第一個關鍵字都不匹配,直接失敗 res="unkown command"; } else if(firstRes.size()==1){//第一個關鍵字匹配且唯一,直接成功 string key=firstRes[0].first+string(" ")+firstRes[0].second; res=doubleCmds[key]; } else{//第一個關鍵字匹配但不唯一,繼續在第一個關鍵字匹配的結果集中匹配第二個 for(int i=0;i<firstRes.size();i++){ if(inputCmd[1]==firstRes[i].second.substr(0,size2)){ secondRes.push_back(firstRes[i]); } } if(secondRes.size()==0){//第二個關鍵字匹配失敗 res="unkown command"; } else if(secondRes.size()==1){//第二個關鍵字匹配且唯一,成功 string key=secondRes[0].first+string(" ")+secondRes[0].second; res=doubleCmds[key]; } else{//第二個關鍵字匹配還是不唯一,失敗 res="unkown command"; } } }}int main(){ string str; while(getline(cin,str)){ string res; findConfigCmd(str,res); cout<<res<<endl; } return 0;}
新聞熱點
疑難解答