这个题当时去考试就得了40分,我的思路是用n个字符串表示每个元素及其祖先结点。 当时考试时漏掉了一个关键的的点:就是祖先结点这一点,还有就是用选择器搜索时要从上往下搜索,修改后100分的代码发在这里
题目描述:
c++代码:
#include <iostream>
#include <cctype>
#include <sstream>
#include <vector>
using namespace std;
const int maxn=1e3;
string css[maxn];
string now[101];
bool mfind(string a,string b) {
int i=0,j=0;
stringstream aa(a),bb(b);
vector <string> sa,sb;
string t;
while(aa>>t)sa.push_back(t);
while(bb>>t)sb.push_back(t);
if(sa.size()<sb.size())return false;
int na=sa.size()-1,nb=sb.size()-1;
if(sa[na][0]=='#'&&sb[nb][0]!='#')na--;
i=na;j=nb;
if(sa[i]==sb[j])
while(i>=nb) {
//i表示当前匹配串的搜索起始位置
j=nb;
if(sa[i]==sb[j]) {
int k=i;
while(j>=0&&k>=0) {
//if(sa[k][0]=='#'&&sb[j][0]!='#')k++;//匹配结构中有id而匹配串中没有的情况
if(sa[k]==sb[j]) {
k--;
j--;
//cout << j << endl;
if(j<0) {
return true;
}
}
else {
k--;
}
}
}
i--;
}
return false;
}
int main() {
int n,m;
cin >> n >> m;
string s;
int d=0;
cin.get();
for(int i=0;i<n;i++) {
getline(cin,s);
int t=0;
int j=0;
while(s[j]=='.'){
t++;j++;
}
d=t/2;
now[d]="";
int p=j;
bool flag=0;
while(p<s.length()) {
if(s[p]=='#') {
flag=1;
now[d]+=s[p];
p++;
continue;
}
else if(!flag) {
now[d]+=tolower(s[p++]);
}
else {
now[d]+=s[p++];//如果是id,因为大小写敏感,所以不使用tolower()
}
}
css[i]="";
for(int k=0;k<=d;k++){
if(k>0)css[i]+=" ";
css[i]+=now[k];
}
//cout << css[i] << endl;
}
string q;
for(int i=0;i<m;i++) {
getline(cin,q);
int p=0;
bool flag=0;
while(p<q.length()) {
if(q[p]=='#') {
flag=1;
p++;
}
else if(!flag) {
q[p]=tolower(q[p]);
p++;
}
else {
q[p]=q[p];
p++;//如果是id,因为大小写敏感,所以不使用tolower()
}
}
int cnt=0;
vector <int>a;
for(int j=0;j<n;j++) {
if(mfind(css[j],q)) {
cnt++;
a.push_back(j+1);
}
}
cout <<cnt;
if(cnt) {
for(int k=0;k<a.size();k++)
cout <<" "<<a[k];
}
cout << endl;
}
return 0;
}