#include <iostream> #include<string> #include<set> #include<vector> using namespace std; //用一个set<string>来存储规则集r(自动排序去重);用一个vector<string>存储数据集I //用二维数组vector<vector<int>>index存储符合规则的I元素的下标,每一行对应set中的一个规则 //对于r中每个元素,遍历I中元素判断r是否是其子串,使用find函数来快速判断 //如果符合要求,则将该I中元素的下标存到二维数组中 //最后根据index来输出即可 //易错点:set容器如果使用string来排序和int的规则不同,只看首位数小的靠前,要注意一下 int main() { //初始化容器 int n; cin>>n; vector<string>I(n); for(int i=0; i<n; i++) cin>>I[i]; int m; cin>>m; set<int>rule;//这里从string改成了int while(m--) { int num; cin>>num; //string r=to_string(num); rule.insert(num); } vector<vector<int>>index;//存储下标 //遍历rule中所有元素 for(int r: rule) { //index新开一行存放r对应的所有下标 index.push_back({}); //遍历I中所有元素 for(int i=0; i<n; i++) { //使用find()函数判断r是否是数据I[i]的子串 if(I[i].find(to_string(r))!=string::npos)//找到子串 { //记录下标到index容器最后一行中 index.back().push_back(i); } } } //根据index来输出结果 //先输出总数k int k=0; for(auto line: index) k+=line.size()>0 ? 2*(line.size()+1) : 0 ; cout<<k; //输出结果 auto it=rule.begin(); for(auto line:index) { if(line.size()==0)//跳过无效规则 { it++; continue; } //输出结果 cout<<" "<<*it<<" "<<line.size(); for(auto i :line) { cout<<" "<<i<<" "<<I[i]; } it++; } return 0; } // 64 位输出请用 printf("%lld")