题解 | #数据分类处理#
数据分类处理
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;
}
腾讯成长空间 6084人发布