CCF201803 URL
Posted gorgeousbankarian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF201803 URL相关的知识,希望对你有一定的参考价值。
题目一如既往的冗长~
这一题小菜鸡我一直没有过,后来是在网上模仿大佬思路写的。
仍然是信息的提取,但有坑!!具体的,代码注释上有:
#include <bits/stdc++.h> using namespace std; string Rules[100],Name[100]; void GetInfo(vector<string> &v,string s)//去‘/‘取信息 { v.clear(); string temp; for(size_t i=1;i<s.size();i++) { if(s[i]==‘/‘){ v.push_back(temp); temp.clear(); } else{ temp+=s[i]; } } if(temp.size()!=0){ v.push_back(temp); } } string Check(string s) { for(size_t i=0;i<s.size();i++) { if(s[i]<‘0‘||s[i]>‘9‘){ return "<str>"; } } return "<int>"; } vector<string> Answer;//存答案 bool Judge(string s,string rules)//所有否定情况都举出,都不符,则真 { Answer.clear();//现将Answer 初始化 vector<string> ju1,ru2; int count=1; //辅助读取 <path> GetInfo(ju1,s); GetInfo(ru2,rules); if(ru2.size()>=1) if((ju1.size()>ru2.size()) &&(ru2[ru2.size()-1]!="<path>")) { return false; } if(ju1.size()<ru2.size()){//judge不可能小 return false; } if(ru2.size()==0&&ju1.size()!=0) return false; /////////// if(ju1.size()>=ru2.size())//大于时,到rule的最后一项必然会有不同 { for(size_t i=0;i<ru2.size();i++)//从最初的一节开始遍历 { if(ju1[i]==ru2[i]){//类型 可能不止占一节 count+=(ju1[i].size()+1); } //不等时 else if(Check(ju1[i])==ru2[i]) { Answer.push_back(ju1[i]); count+=1+ju1[i].size(); } else if(ru2[i]=="<path>"){//非<path> Answer.push_back(s.substr(count));//一直读到最后 }//还不能判断是否可以,因为还有末尾的‘/‘ else { return false; } } } //提取信息时,去掉了‘/‘,所以判断时要注意末尾的‘/‘ 很坑呐,因为末尾都可以是‘/‘ 。坑啊啊啊啊!! if(s[s.size()-1]==‘/‘&&rules[rules.size()-1]!=‘/‘){ return false; } if(s[s.size()-1]!=‘/‘&&rules[rules.size()-1]==‘/‘){ return false; } ////////// return true; //终极真!!! } int Str_to_Num(string str)//转换为整型,去掉前导零 { int num=0; for(size_t i=0;i<str.size();i++) { num=num*10+(str[i]-‘0‘); } return num; } int main() { int n=0,m=0; cin>>n>>m; int i=0; for(i=0;i<n;i++) { cin>>Rules[i]>>Name[i]; } while(m--) { string s; cin>>s; bool flag=false; for(i=0;i<n;i++) { if(Judge(s,Rules[i])){ flag=true; break; } } if(flag==false){ cout<<"404"<<endl; } else{//true cout<<Name[i]; for(size_t j=0;j<Answer.size();j++) { if(Check(Answer[j])=="<int>") { cout<<‘ ‘; cout<<Str_to_Num(Answer[j])<<‘ ‘; } else{ cout<<‘ ‘; cout<<Answer[j]; } } cout<<endl; } } return 0; }
以上是关于CCF201803 URL的主要内容,如果未能解决你的问题,请参考以下文章