题解 | #数据分类处理#
数据分类处理
http://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd
这个题目如果把思路理清了就不难,主要是处理起来比较麻烦。我的思路是先用2个vector<int>存输入(即题目中的I和R序列),v2排序去重之后,将v1、v2转换成vector<string>,方便查找子串。然后初始化一个长度为v2.size()的数组nums,用来存每个v2元素在v1中对应满足条件的个数;初始化一个v2.size()*v1.size()的二维数组array,用来存v1中满足条件的元素下标。这样对每个v2中的元素v2[i],在v1中对应元素的个数为nums[i],下标遍历array[i]就能得到。
上述方法还可省一点空间,就是不要nums,因为nums[i]的值就是array[i].size()的值。</string></int>
#include<iostream> #include<vector> #include<algorithm> using namespace std; string itoa(int n){ string ans=""; if(n==0) return "0"; while(n){ ans+=n%10+'0'; n/=10; } reverse(ans.begin(), ans.end()); return ans; } int main(){ int n1,n2; long long n; while(cin>>n1){ vector<long long> v1,v2; vector<string> s1,s2; for(int i=0;i<n1;i++){ cin>>n; v1.push_back(n); } cin>>n2; for(int i=0;i<n2;i++){ cin>>n; v2.push_back(n); } sort(v2.begin(),v2.end()); v2.erase(unique(v2.begin(),v2.end()), v2.end()); vector<int> nums(v2.size(),0);//存v2中每个元素在v1中满足条件的个数 vector<vector<int>> array(v2.size());//v1中满足条件的元素对应的位置 //转换成字符串处理 for(int i=0;i<n1;i++){ s1.push_back(itoa(v1[i])); } for(int i=0;i<v2.size();i++){ s2.push_back(itoa(v2[i])); } string::size_type pos; for(int i=0;i<v2.size();i++){ for(int j=0;j<n1;j++){ pos = s1[j].find(s2[i]); if(pos!=string::npos){ nums[i]++; array[i].push_back(j); } } } //打印输出 int res=0; for(int i=0;i<v2.size();i++){ if(array[i].size()!=0){ res+=2+2*array[i].size(); } } cout<<res; for(int i=0;i<v2.size();i++){ if(array[i].size()!=0){ cout<<' '<<v2[i]<<' '<<array[i].size(); for(int j=0;j<array[i].size();j++){ cout<<' '<<array[i][j]<<' '<<v1[array[i][j]]; } } } cout<<endl; } return 0; }