CCF201809-3

我的程序

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;typedef struct TreeNode {string label;string id;int LineNum;int DotNum;struct TreeNode* child;struct TreeNode* bother;struct TreeNode* father;TreeNode() {                  //结构体初始化this->label = "";this->id = "";this->LineNum = 0;this->DotNum = -1;this->father = NULL;this->bother = NULL;this->child = NULL;}
}TreeNode, * TreeNodePointer;class solution {private:TreeNodePointer root;TreeNodePointer recent;public:solution() {root = new TreeNode;recent = root;}void Insert(TreeNodePointer t) {            //由上一个插入节点向上回溯,避免匹配错误TreeNodePointer p = recent;if (t->DotNum > p->DotNum) {p->child = t;}else if (t->DotNum == p->DotNum) {p->bother = t;}else {while (p->DotNum != t->DotNum) {p = p->father;}while (p->bother) {   //实际上没有必要,因为在与t相同级数的节点中,该子树节点与t是最后两个p = p->bother;}p->bother = t;}t->father = p;recent = t;}static bool CompareLabel(TreeNodePointer t, string SelectItem) {return t->label == SelectItem;}static bool CompareId(TreeNodePointer t, string SelectItem) {return t->id == SelectItem;}void find(bool(*compare)(TreeNodePointer t, string SelectItem), string SelectItem, TreeNodePointer r, vector<int>& ans) {if (r == NULL)return;if (compare(r, SelectItem))ans.push_back(r->LineNum);find(compare, SelectItem, r->child, ans);find(compare, SelectItem, r->bother, ans);}vector<int> FindLabel(string SelectItem) {vector<int> ans;find(CompareLabel, SelectItem, root, ans);return ans;}vector<int> FindId(string SelectItem) {vector<int> ans;find(CompareId, SelectItem, root, ans);return ans;}void FindLast(vector<string>& SelectItems, TreeNodePointer r, vector<int>& ans, int size) {if (r == NULL)return;if (r->id == SelectItems[size - 1] || r->label == SelectItems[size - 1]) {int flag = size - 2;TreeNodePointer p = r;while (p->father) {p = p->father;if (p->id == SelectItems[flag] || p->label == SelectItems[flag]) {flag--;}if (flag < 0) {break;}}if (flag < 0)ans.push_back(r->LineNum);}FindLast(SelectItems, r->child, ans, size);FindLast(SelectItems, r->bother, ans, size);}vector<int> MultipleFind(vector<string>& SelectItems) {vector<int> ans;FindLast(SelectItems, root, ans, SelectItems.size());return ans;}
};void func() {solution tree;int m, n;cin >> n >> m;char c = getchar();                //消除换行符for (int i = 1;i <= n;i++) {                      //构建结构树string label, id, line;int DotNum = 0;getline(cin, line);int j = 0;while (line[j] == '.') {                //计算小数点j++;DotNum++;}if (DotNum > 0) {line.erase(0, DotNum);}int index = line.find("#");      //分离label和idif (index != string::npos) {id = line.substr(index);label = line.substr(0, index - 1);}else {id = "";label = line;}transform(label.begin(), label.end(), label.begin(), ::tolower);          //标签选择器对于大小写不敏感TreeNodePointer tmp = new TreeNode;tmp->DotNum = DotNum;tmp->id = id;tmp->label = label;tmp->LineNum = i;tree.Insert(tmp);}string* SelectItems = new string[m];            //选择器查询for (int i = 0;i < m;i++) {getline(cin, SelectItems[i]);}for (int i = 0;i < m;i++) {vector<int> ans;int index = SelectItems[i].find(" ");if (index != string::npos) {          //多重选择器vector<string> query;char* sp = strtok((char*)SelectItems[i].c_str(), " ");//将插叙用空格分割,按序存放在query向量中 while (sp){string tmp(sp);if (tmp[0] != '#') {transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);}query.push_back(tmp);sp = strtok(NULL, " ");}ans = tree.MultipleFind(query);}else {if (SelectItems[i][0] == '#') {               //id选择器ans = tree.FindId(SelectItems[i]);}else {                                       //标签选择器ans = tree.FindLabel(SelectItems[i]);}}sort(ans.begin(), ans.end());cout << ans.size() << " ";for (int j = 0;j < ans.size();j++) {cout << ans[j] << " ";}cout << endl;}
}int main() {func();return 0;
}

别人的程序
引用自CCF CSP 真题题解


#include<iostream>
#include<string>
#include<cstring>
#include<vector>using namespace std;const int N=105;struct Node{string lable,id;//标签和属性 int cnt;//缩进
}a[N];//将字符串化成小写
void mystrlwr(string &s)
{for(int i=0;i<s.length();i++)s[i]=tolower(s[i]);
}//在数组a中[1,start]寻找缩进小于cnt,且标签或属性等于s的元素
bool search(Node a[],int &start,int &cnt,string s)
{for(int i=start;i>=1;i--)//遍历 {if(a[i].cnt<cnt) {//查询成功cnt=a[i].cnt,start=i;//保证a[i]是它的父亲,即第一个缩进小于它的元素 if(s==a[i].lable||s==a[i].id) return true;//成功 }}return false;//查询失败
}int main()
{int n,m;string s;cin>>n>>m;//读入n和m getchar();//读取换行符 for(int i=1;i<=n;i++){getline(cin,s);//pos1记录标签的起始位置,pos2记录id属性的起始位置,cnt记录缩进 int pos1=-1,pos2=-1,cnt=0; for(int j=0;j<s.length();j++)if(s[j]=='.')cnt++;else if(pos1==-1&&s[j]!='#')pos1=j;else if(s[j]=='#')pos2=j;a[i].cnt=cnt;if(pos2==-1)//如果不存在id属性 {a[i].lable=s.substr(pos1);a[i].id="";//置为空 }else//存在id属性 {a[i].lable=s.substr(pos1,pos2-pos1-1);a[i].id=s.substr(pos2);}mystrlwr(a[i].lable);//由于标签属性大小写不敏感,因此统一换成小写 }for(int i=0;i<m;i++)//读入m个查询 {char tmp[100];vector<string>query;//存储查询 vector<int>ans;//存储结果 gets(tmp);//读入 char *sp=strtok(tmp," ");//将插叙用空格分割,按序存放在query向量中 while(sp){query.push_back(sp);sp=strtok(NULL," ");}int len=query.size();for(int j=0;j<len;j++)//将标签统一化成小写 if(query[j][0]!='#')  mystrlwr(query[j]);for(int j=1;j<=n;j++)//遍历n行元素 {if(query[len-1]==a[j].id||query[len-1]==a[j].lable)//最后一级选择器匹配了 {int start=j,cnt=a[j].cnt,k=len-2;//使用search函数匹配各级父选择器 for(;k>=0;k--){if(!search(a,start,cnt,query[k])) break;}if(k<0)//成功ans.push_back(j); }}//输出结果 cout<<ans.size();for(int j=0;j<ans.size();j++)cout<<" "<<ans[j];cout<<endl;}return 0;
}

CCF201809-3相关推荐

  1. CCF201809(Java)

    第一题: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商店都自己定了一个价格.店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自 ...

  2. CCFCSP 2018年9月 -- 部分题目

    CCF201809  --  第一题 :买菜 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商店都自己定了一个正整数的价格.店主们希望自己的菜价和其 ...

最新文章

  1. android网络获取经纬,Android中透过GPS或NetWork获取当前位置的经纬度
  2. 为什么从前那些.NET开发者都不写单元测试呢?
  3. VMware虚拟机中VMnet0上的网桥当前未运行
  4. PAT_B_1082_C++(20分)
  5. Oracle零碎要点---多表联合查询,收集数据库基本资料
  6. 配置jboss,mysql,seam,eclipse步骤(一)
  7. kali 19.2 搭建ftp服务器
  8. 员工提出离职时,再挽留已经迟了
  9. 【推荐算法】协同过滤算法介绍
  10. 单片机通过WIFI模块(ESP8266)获取网络时间与天气预报
  11. python+mitmdump实战(3/3)(附源码)
  12. 宏先生说:口罩和额温枪的套路!
  13. vue延迟渲染组件_Vue 动态组件渲染问题分析
  14. Oracle数据库中神奇的dual表
  15. 奥斯卡大赢家影片:《瞬息全宇宙》背后的AI技术揭秘
  16. 如何用深度学习进行语音识别
  17. oracle查询数据都是问号,Oracle数据库PL/SQL Developer查询结果显示问号乱码的解决方法...
  18. 麒麟服务器v10系统安装时报错,银河麒麟V10服务器版本编译安装php7.2.12
  19. 从内存角度深入看结构体(window/linux)大小
  20. 使用python编写的落网电台下载工具

热门文章

  1. USB总线虚拟示波器,用高性能硬件模块,组合成多种仪器
  2. JMeter常用函数整理
  3. 安卓app开机自启动代码
  4. 深度学习mindspore --- win10系统cpu下安装mindspore
  5. 我们都是被上帝咬过的苹果
  6. java获取上周一_java 如何获取 上周一日期,上周末日期,本周一日期。
  7. 电脑主板为什么不取消电池?
  8. 这十个时间千万别受孕
  9. 如何开通个人微信公众号(订阅号)
  10. 2D转换+动画+3D转换