试题编号: | 201809-3 |
试题名称: | 元素选择器 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
#include<iostream>
#include<vector>
using namespace std;
string str[105],s;
int dotNum[105]={0};
int n,m;
int deal(vector<string> find){
vector<int> flag;flag.push_back(-1);//flag数组记录每次找到匹配项时所在的层次,即小数点数
vector<int> res;
int x=0;
for(int i=0;i<n;i++){
if(dotNum[i]<=flag[flag.size()-1]){//若当前的层数小于我要找的最小层数,则find与flag各退一层
x--;if(x<0)x=0;
flag.erase(flag.end()-1);
}else{//若当前查找的层数满足要求
string temp=str[i];string fx=find[x];//从temp中找fx
int index=temp.find(fx);//若能找到,再分析找到的位置是否合法
if(index<temp.size() && (index==0 || temp[index-1]==' ' || temp[index-1]=='.')){
flag.push_back(dotNum[i]);//都合法,则说明又找到一层 此时把层数计入flag,再把find指向下一个查找项
x++;
if(x>=find.size()){//若要查找的数到头了,则找完了
res.push_back(i+1);//找完了则应该再退一个,看看该层中是否还有别的满足要求的
x--;
if(flag.size()>1)flag.erase(flag.end()-1);
}
}
}
}
cout<<res.size();
for(int i=0;i<res.size();i++){
cout<<" "<<res[i];
}
cout<<endl;
}
int main(){
cin>>n>>m;
getline(cin,s);
for(int i=0,j,k;i<n;i++){
getline(cin,s);
for(j=0;j<s.size();j++){
if(s[j]!='.'){
dotNum[i]=j;
break;
}
}
for(k=j;k<s.size();k++){//输入正文后,修改大小写
if(s[k]>='A' && s[k]<='Z')s[k]+=32;
if(s[k]=='#')break;
}
str[i]=s;
}
while(m--){
vector<string> find;
getline(cin,s);
for(int k=0;k<s.size();k++){//第一次扫描要查找的内容,修改大小写
if(s[k]=='#'){
while(1){
if(k>=s.size())break;
if(s[k]==' ')break;
k++;
}
}
if(s[k]>='A' && s[k]<='Z')s[k]+=32;
}
int a=0,b=0;
while(b<s.size()){//第二次扫描,根据空格将字符分解,装入数组
while(1){
if(b>=s.size())break;
if(s[b]==' ')break;
b++;
}
find.push_back(s.substr(a,b-a));
b++;a=b;
}
deal(find);//将拆分后的数组与模板进行对比查找
}
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答