csp考試第四題 元素選擇器
阿新 • • 發佈:2018-12-26
考試時太緊張沒做出來,心疼自己一秒鐘,刷了很多字串的題沒派上用場,今天自己又思考了下,有了思路,寫了幾個樣例都過了,等平臺開發了測測程式碼能拿多少分(程式碼複雜度不高,O(n)級別)
#include<bits/stdc++.h> using namespace std; struct node { int hang;//行數 int level;//層數 string label;//標籤 string id;//id node(int hang,int level,string label,string id) :hang(hang),level(level),label(label),id(id) { } node() { } }; int cmp(node a,node b) { if(a.level!=b.level) return a.level < b.level; else return a.hang < b.hang; } node arr[101]; vector<string> V; vector<int> A; void solve(int st,int end,int pace,int level) { int i,j,k; int min=0; if(pace==V.size()-1) { for(i=st;i<=end;i++) { if(((arr[i].id==V[pace])||(arr[i].label==V[pace]))&&arr[i].level>=level) { A.push_back(i); } } } else { int mindex=-1; int mlevel; for(i=st;i<=end;i++) { if((arr[i].id==V[pace])||(arr[i].label==V[pace])) { mindex=i; mlevel=arr[i].level; break; } } if(mindex!=-1) { for(;i<=end;i++) { if(((arr[i].id==V[pace])||(arr[i].label==V[pace]))&&arr[i].level<mlevel) { mindex=i; mlevel=arr[i].level; } } solve(st,arr[mindex].hang-2,pace,level+1); solve(arr[mindex].hang,end,pace+1,mlevel+1); } } } int main() { string line; int n,m; // freopen("1.txt","r",stdin); cin>>n>>m; getchar(); int i,j,k; int level; string label,id; for(i=0;i<n;i++) { getline(cin,line); j=0; while(j<line.length()&&line[j]=='.') { j++; } level=j/2; k=line.find(' ',j+1); if(k==-1) { label=line.substr(j,line.length()-j); id=""; } else { label=line.substr(j,k-j); id=line.substr(k+1,line.length()-k-1); } arr[i]=node(i+1,level,label,id); } for(i=0;i<m;i++) { getline(cin,line); j=0; k=line.find(' ',j+1); while(j<line.length()) { if(k==-1) k=line.length(); string temp=line.substr(j,k-j); V.push_back(temp); j=k+1; k=line.find(' ',j+1); } solve(0,n-1,0,0); V.clear(); sort(A.begin(),A.end()); cout<<A.size(); for(j=0;j<A.size();j++) cout<<" "<<A[j]+1; cout<<endl; A.clear(); } }