信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。
采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。
一组输入整数序列I
和一组规则整数序列R
,I和R序列的第一个整数为序列的个数(个数不包含第一个整数);整数范围为0~0xFFFFFFFF,序列个数不限
从R依次中取出R ,对I进行处理,找到满足条件的I
按R从小到大的顺序:
(1)先输出R;
(2)再输出满足条件的I
(3)然后输出满足条件的I
(4)最后再输出I
附加条件:
(1)R需要 从 小 到 大 \color{red}{从小到大} 从小到大排序。相同的R只需要输出索引小的以及满足条件的I
(2)如果没有满足条件的I
(3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)
序列I:
15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数)
序列R:
5,6,3,6,3,0(第一个5表明后续有5个整数)
输出:
30 \color{red}{30} 30, 3 \color{red}{3} 3,6,0,123,3,453,7,3,9,453456,13,453,14,123, 6 \color{red}{6} 6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786
说明:
30 − − − 后 续 有 30 个 整 数 \color{red}{30 --- 后续有30个整数} 30−−−后续有30个整数
3 − − − 从 小 到 大 排 序 , 第 一 个 R < i > 为 0 , 但 没 有 满 足 条 件 的 I < j > , 不 输 出 0 , 而 下 一 个 R < i > 是 3 \color{red}{3 --- 从小到大排序,第一个R为0,但没有满足条件的I
6 ---- 存在6个包含3的I
0 ---- 123所在的原序号为0
123 ---- 123包含3,满足条件
输入
15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123
5 6 3 6 3 0
输出
30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786
#include
#include
#include
#include
using namespace std;
// 判断是否是子串
bool isSubStr(string sSub, int Str)
{
string sStr = to_string(Str);
return sStr.find(sSub) != string::npos;
}
// 判断序列I中的元素i是否包含的子串sub,并返回下标和值
vector<int> getSubstr(int sub, vector<int> I)
{
vector<int> result;
int is = I.size();
string sSub = to_string(sub);
for (int pos = 0; pos < is; pos++)
{
if(isSubStr(sSub, I[pos]))
{
result.push_back(pos);
result.push_back(I[pos]);
}
}
return result;
}
// 获取序列I中所有满足规则序列R的元素下标、数值,以及个数
vector<int> dataClassify(vector<int> I, vector<int> R)
{
vector<int> Result;
// 遍历R,对R中的每一个规则整数r,遍历序列I,获取满足的数据
for (vector<int>::iterator ri = R.begin(); ri != R.end(); ri++)
{
int r = *ri;
vector<int> sv = getSubstr(r, I);
int ss = sv.size();
if (ss > 0)
{
Result.push_back(r);
Result.push_back(ss/2);
Result.insert(Result.end(), sv.begin(), sv.end());
}
}
return Result;
}
int main()
{
// 循环处理
int in,rn;
while(cin>>in)
{
// 读取输入数据序列I和R;
vector<int> I, R;
int temp;
for (size_t i = 0; i < in; i++)
{
cin>>temp;
I.push_back(temp);
}
cin>>rn;
for (size_t i = 0; i < rn; i++)
{
cin>>temp;
R.push_back(temp);
}
// 排序和去重序列R;
sort(R.begin(), R.end());
R.erase(unique(R.begin(), R.end()), R.end());
// 对数据进行分类
vector<int> Result = dataClassify(I, R);
// 输出结果
cout<< Result.size() << " ";
for (vector<int>::iterator Ri = Result.begin(); Ri != Result.end(); Ri++)
{
cout << *Ri << " ";
}
cout << endl;
}
return 0;
}