信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、QQ 用户、手机号码、银行帐号等信息及活动记录。采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。
信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、QQ 用户、手机号码、银行帐号等信息及活动记录。采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。
第一行先输入一个整数
代表数据集
中的数据条数。随后,在同一行输出
个整数
代表数据。
第二行先输入一个整数
代表分类规则集
中的规则条数。随后,在同一行输出
个整数
代表规则。
在一行上:
先输出一个整数
,代表一共需要输出的数字个数。简单地说,这个数字为下文中你输出数量的个数统计。
随后,对于规范后的每一条规则,如果其有效:先输出这条规则本身,随后输出一个整数
,代表符合该规则的数据条数;随后输出
个二元组
,代表符合这条规则的数据在
中的位置、数据本身。其中,位置从
开始计数。如果其无效,则跳过这条规则。
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
在这组样例中,给定的原始数据集为
,给定的原始规则集为
。
规范化后的规则集为
。
随后,对
进行分类处理:
对于规则
,由于
中不存在以
为连续子串的数据,因此该规则无效,跳过;
对于规则
,
中以
为连续子串的数据有:
、
、
、
、
、
,因此该规则有效。根据输出描述,先输出规则本身
、随后输出符合要求的条数
、随后输出符合要求的数据在
中的位置和整数本身
;
对于规则
,
中以
为连续子串的数据有:
、
、
、
、
、
、
,因此该规则有效。根据输出描述,先输出规则本身
、随后输出符合要求的条数
、随后输出符合要求的数据在
中的位置和整数本身。
不要忘了在输出开始的整数
,在这个样例中,一共输出了
个数字,所以
。
本题由牛客重构过题面,您可能想要阅读原始题面,我们一并附于此处。
【以下为原始题面】
从R依次中取出R<i>,对I进行处理,找到满足条件的I:
I整数对应的数字需要连续包含R<i>对应的数字。比如R<i>为23,I为231,那么I包含了R<i>,条件满足 。
按R<i>从小到大的顺序:
(1)先输出R<i>;
(2)再输出满足条件的I的个数;
(3)然后输出满足条件的I在I序列中的位置索引(从0开始);
(4)最后再输出I。
附加条件:
(1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I,索引大的需要过滤掉
(2)如果没有满足条件的I,对应的R<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, 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
说明:
30----后续有30个整数
3----从小到大排序,第一个R<i>为0,但没有满足条件的I,不输出0,而下一个R<i>是3
6--- 存在6个包含3的I
0--- 123所在的原序号为0
123--- 123包含3,满足条件
#include <stdio.h>
#include <math.h>
int main() {
int n1,n2;
scanf("%d",&n1);
int I[n1];
for(int i=0;i<n1;i++)
{
scanf("%d",&I[i]);
}
scanf("%d",&n2);
int R[n2],flag[n2][n1],flag2[n2],flag3=0;
for(int i=0;i<n2;i++)
{
scanf("%d",&R[i]);
flag2[i]=0;
for(int j=0;j<n1;j++)
{
flag[i][j]=0;
}
}
for(int i=0;i<n2;i++)
{
int t;
for(int j=i+1;j<n2;j++)
{
if(R[i]>R[j])
{
t=R[i];
R[i]=R[j];
R[j]=t;
}
}
}
for(int i=0;i<n2;i++)
{
if(i>0)
{
if(R[i]==R[i-1])
continue;
}
int count=0,temp=R[i];
while(temp)
{
temp/=10;
count++;
}
for(int j=0;j<n1;j++)
{
int t=I[j];
while(t)
{
if(count!=0)
{
int a=0;
a=pow(10,count);
if(t%a==R[i])
{
flag[i][j]=1;
break;
}
else {
t/=10;
}
}
else {
if(t==R[i])
{
flag[i][j]=1;
break;
}
else{
break;
}
}
}
}
}
int sum=0;
for(int i=0;i<n2;i++)
{
for(int j=0;j<n1;j++)
{
sum+=flag[i][j];
flag2[i]+=flag[i][j];
}
if(flag2[i])
flag3+=1;
}
int x;
x=sum*2+flag3*2;
printf("%d",x);
for(int i=0;i<n2;i++)
{
if(i>0)
{
if(R[i]==R[i-1])
continue;
}
if(flag2[i])
{
printf(" %d %d",R[i],flag2[i]);
for(int j=0;j<n1;j++)
{
if(flag[i][j])
{
printf(" %d %d",j,I[j]);
}
}
}
}
printf("\n");
return 0;
} #include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b)
{
return *(long long *)a-*(long long *)b;
}
int main() {
int ni,nr,i,j,fr[101][101]={0},count=0,sum=0;
long long I[101]={0},R[101]={0},temp,temp1,f;
scanf("%d",&ni);
for(i=0;i<ni;i++)
scanf("%lld",&I[i]);
scanf("%d",&nr);
for(i=0;i<nr;i++)
{
scanf("%lld",&temp);
f=0;
for(j=0;j<i;j++)
{
if(temp==R[j]) //Ri重复,去重
{
f=1;break;
}
}
if(f==0) R[count++]=temp;
}
nr=count; //更新Ri数量
count=0;
qsort(R,nr,sizeof(long long int),cmp);
for(i=0;i<nr;i++)
{
count=0;
for(j=0;j<ni;j++)
{
temp=R[i];
temp1=I[j];
f=temp1;
while(temp1>0)
{
if(temp%10==temp1%10 && f==temp1) //发现相同部分并判断连续
{
temp=temp/10;
temp1=temp1/10;
f=temp1;
}
else if(temp==R[i]) //还没找到相同部分
{
temp1=temp1/10;
f=temp1;
}
else if(temp!=R[i])//找到了相同部分,但是中断了
{
temp=R[i];
}
else temp1=temp1/10;
if(temp==0 && temp!=R[i]) break;
}
if(temp==0 && temp!=R[i]) //当前Ii合规
{
fr[i][0]++;
fr[i][++count]=j;
}
}
if(fr[i][0]!=0) sum=sum+fr[i][0]*2+2; //合规Ii+对应坐标+当前Ri+Ii数量
}
printf("%d ",sum);
for(i=0;i<nr;i++)
{
if(fr[i][0]!=0)
{
printf("%lld %d ",R[i],fr[i][0]);
for(j=1;j<=fr[i][0];j++)
{
if(i==(nr-1) && j==fr[i][0]) printf("%d %lld",fr[i][j],I[fr[i][j]]);
else printf("%d %lld ",fr[i][j],I[fr[i][j]]);
}
}
}
return 0;
} #include <stdio.h>
typedef struct data {
int index;
int value;
} DATA;
//判断R[i]是否在I里面
int R_IN_I(int a, int b) {
while (a) {
if (b == a % 10 || b == a % 100 || b == a % 1000)
return 1;
a = a / 10;
}
return 0;
}
int main() {
int a, b;
int I[100] = {0};
int R[100] = {0};
scanf("%d", &a);
for (int i = 0; i < a; i++) {
scanf("%d", &I[i]);
}
scanf("%d", &b);
for (int i = 0; i < b; i++) {
scanf("%d", &R[i]);
}
//将序列R去重排序
int temp = 0;
int R1[100] = {0};
int p = 0;
for (int i = 0; i < b - 1; i++) {
for (int j = 0; j < b - 1 - i; j++) {
if (R[j] > R[j + 1]) {
temp = R[j];
R[j] = R[j + 1];
R[j + 1] = temp;
}
}
}
R1[0] = R[0];
for (int i = 0; i < b - 1; i++) {
if (R[i] != R[i + 1])
R1[++p] = R[i + 1];
}
//统计R[i]在I里的数量
int count[100] = {0};
DATA data[100][100] = {0};
for (int i = 0; i < p + 1; i++) {
int q = 0;
for (int j = 0; j < a; j++) {
if (R_IN_I(I[j], R1[i])) {
count[i]++;
data[i][q].index = j;
data[i][q].value = I[j];
q++;
}
}
}
//整理输出格式
int sum = 0;
for (int i = 0; i < 100; i++) {
if (count[i]) {
sum += 2 + 2 * count[i];
}
}
printf("%d ", sum);
for (int i = 0; i < 100; i++) {
if (count[i]) {
printf("%d %d ", R1[i], count[i]);
for (int j = 0; j < count[i]; j++) {
printf("%d %d ", data[i][j].index, data[i][j].value);
}
}
}
return 0;
} //超时了。。
#include <stdio.h>
#include <stdbool.h>
#define MAX 100
bool contains(int container, int num) {
int c_mode = 0;
int n_mode = 0;
int n_temp = num;
bool flag = false;
if (container == num)
return true;
if (container < num)
return false;
n_mode = n_temp % 10;
n_temp /= 10;
while (container) {
c_mode = container % 10;
container /= 10;
if (n_mode == c_mode) {
if (!n_temp)
return true;
n_mode = n_temp % 10;
n_temp /= 10;
flag = true;
} else {
n_temp = num;
n_mode = n_temp % 10;
n_temp /= 10;
if (flag)
container *= 10;
}
}
return false;
}
void sort(int R[], int total_R) {
for (int i = 0; i < total_R; i++) {
int min_R = R[i];
int index = 0;
bool flag = false;
for (int j = i + 1; j < total_R; j++)
if (R[j] < min_R) {
min_R = R[j];
index = j;
flag = true;
}
if (flag) {
R[index] = R[i];
R[i] = min_R;
}
}
}
int main() {
int I[MAX] = { 0 };
int R[MAX] = { 0 };
int total_I, total_R;
scanf("%d", &total_I);
for (int i = 0; i < total_I; i++)
scanf("%d", &I[i]);
scanf("%d", &total_R);
for (int i = 0; i < total_R; i++)
scanf("%d", &R[i]);
sort(R, total_R);
int out_info[MAX * MAX] = { 0 };
int index = 1;
for (int i = 0; i < total_R; i++) {
int contain_count = 0;
bool flag = false;
if (i > 0 && R[i] == R[i - 1])
continue;
out_info[index++] = R[i];
for (int j = 0; j < total_I; j++) {
if (contains(I[j], R[i])) {
contain_count++;
out_info[++index] = j;
out_info[++index] = I[j];
flag = true;
}
}
if (flag) {
out_info[index - contain_count * 2] = contain_count;
index++;
} else
index--;
}
out_info[0] = index - 1;
for (int i = 0; i <= index - 1; i++)
printf("%d ", out_info[i]);
return 0;
} #include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int bitMask(int num) {
int mask = 10;
while (num / 10 != 0) {
num /= 10;
mask *= 10;
}
return mask;
}
int contains(int src, int num) {
int mask = bitMask(num);
while (src != 0) {
if (src % mask == num) {
return 1;
}
src /= 10;
}
return 0;
}
int main() {
int iarr[100] = {0}, rarr[100] = {0};
int inum = 0, rnum = 0;
scanf("%d", &rnum);
for (int i = 0; i < rnum; ++i) {
scanf("%d", rarr+i);
}
scanf("%d", &inum);
for (int i = 0; i < inum; ++i) {
scanf("%d", iarr+i);
}
// 排序
qsort(iarr, inum, sizeof(int), compare);
int arr[100][202] = {0};
int idx = 0, sum = 0;
for (int i = 0; i < inum; ++i) {
// 去重
if (i > 0 && iarr[i] == iarr[i-1]) {
continue;
}
int tail = 2, cnt = 0;
for (int j = 0; j < rnum; ++j) {
if (contains(rarr[j], iarr[i])) {
// printf("i: %d, %d %d \n", iarr[i], j, rarr[j]);
// 写入index和值
arr[idx][tail++] = j;
arr[idx][tail++] = rarr[j];
++cnt;
}
}
if (cnt == 0) {
continue;
}
// 记录指令和数量
arr[idx][0] = iarr[i];
arr[idx][1] = cnt;
// 计算数字总数
sum += cnt * 2 + 2;
++idx;
}
printf("%d ", sum);
// printf("\n");
for (int i = 0; i < idx; ++i) {
for (int j = 0; j < arr[i][1] * 2 + 2; ++j) {
printf("%d ", arr[i][j]);
}
// printf("\n");
}
return 0;
} #include <stdio.h>
#include <string.h>
#define N 100
#define M 32
int cnt=1;
int match(char str1[],char str2[],int len1,int len2)
{
int k=0;
int i=k,j=0;
while(i<len1&&j<len2)
{
if(str1[i]==str2[j])
{
i++;
j++;
}
else
{
k++;
i=k;
j=0;
}
}
if(j==len2)
return 1;
else
return 0;
}
int main()
{
int numi,numr,I[N],R[N],i,j,k,arr[3*N],temp,flag,flag1[N],left,right,len1,len2;
char str1[N][M],str2[N][M],ch;
scanf("%d",&numi);
for(i=0;i<numi;i++)
{
scanf("%d",&I[i]);
temp=I[i];
j=0;
if(temp==0)
{
str1[i][0]='0';
str1[i][1]='\0';
}
else
{
left=0;right=0;
while(temp>0)
{
str1[i][j++]=temp%10+'0';
temp/=10;
right++;
}
str1[i][right]='\0';
right--;
while(left<right)
{
ch=str1[i][left];
str1[i][left]=str1[i][right];
str1[i][right]=ch;
left++;right--;
}
}
}
scanf("%d",&numr);
for(i=0,j=0;i<numr;i++)
{
scanf("%d",&temp);
if(i==0)
{
R[j++]=temp;
}
else
{
flag=0;
for(k=0;k<j;k++)
{
if(temp==R[k])
{
flag=1;break;
}
}
if(flag==0)
{
R[j++]=temp;
}
}
}
k=j;
for(i=0;i<k-1;i++)
{
for(j=0;j<k-1-i;j++)
{
if(R[j]>R[j+1])
{
temp=R[j];
R[j]=R[j+1];
R[j+1]=temp;
}
}
}
for(i=0;i<k;i++)
{
j=0;
if(R[i]==0)
{
str2[i][0]='0';
str2[i][1]='\0';
}
else
{
left=0;right=0;temp=R[i];
while(temp>0)
{
str2[i][j++]=temp%10+'0';
temp/=10;
right++;
}
str2[i][right]='\0';
right--;
while(left<right)
{
ch=str2[i][left];
str2[i][left]=str2[i][right];
str2[i][right]=ch;
left++;right--;
}
}
}
for(i=0;i<k;i++)
{
len2=strlen(str2[i]); //str2为要查找的子串序列
temp=0;
for(j=0;j<numi;j++)
{
flag1[j]=0;
len1=strlen(str1[j]); //str1为主串序列
flag1[j]=match(str1[j],str2[i],len1,len2);
temp+=flag1[j];
}
if(temp!=0)
{
arr[cnt++]=R[i];
arr[cnt++]=temp;
for(j=0;j<numi;j++)
{
if(flag1[j]==1)
{
arr[cnt++]=j;
arr[cnt++]=I[j];
}
}
}
}
arr[0]=cnt-1;
for(i=0;i<cnt;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
写了几个小时。。。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*全局变量*/
int Total = 0;
/*函数声明*/
void Rank(int *R, int Len_R);
int Cal_Weight(int R);
void Match_I(int R, int *I, int Len_I, int *Output);
int main()
{
/*int Len_I = 15;
int I[10000] = { 123, 456, 786, 453, 46, 7, 5, 3, 665, 453456, 745, 456, 786, 453, 123 };
int Len_R = 5;
int R[10000] = {6, 3,6, 3, 0 };
int Output[10000] = { 0 };*/
int Len_I = 0;
int Len_R = 0;
int I[1000] = { 0 };
int R[1000] = {0};
int Output[1000] = { 0 };
while (scanf("%d", &Len_I) != EOF)
{
for (int i = 0; i < Len_I; i++)
{
scanf("%d", &I[i]);
}
scanf("%d", &Len_R);
for (int i = 0; i < Len_R; i++)
{
scanf("%d", &R[i]);
}
Rank(R, Len_R);
for (int i = 0; i < Len_R; i++)
{
if (!i)
Match_I(R[i], I, Len_I, Output);
else if (R[i - 1] != R[i])
Match_I(R[i], I, Len_I, Output);
}
Output[0] = Total;
//Match_I(0, I, Len_I, Output);
for (int i = 0; i < Total + 1; i++)
printf("%d ", Output[i]);
printf("\n");
/*多组数据输入,需要每个循环清空数组和全局变量*/
memset(I, 0, sizeof(I));
memset(R, 0, sizeof(R));
memset(Output, 0, sizeof(Output));
Total = 0;
}
}
/*将R数组从小到大排序*/
void Rank(int *R, int Len_R)
{
int temp = 0, k = 0;
for (int i = 0; i < Len_R - 1; i++)
{
for (int j = i + 1; j < Len_R; j++)
{
if (R[i] > R[j])
{
temp = R[i];
R[i] = R[j];
R[j] = temp;
}
}
}
}
/*算出R是几位数,取模运算来匹配I数组*/
int Cal_Weight(int R)
{
if (R < 10)
return 10;
else if (10 <= R && R < 100)
return 100;
else if (100 <= R && R < 1000)
return 1000;
else
return 0;
}
/*匹配I数组*/
void Match_I(int R, int *I, int Len_I, int *Output)
{
int weight_R = 0, temp = 0;
int match_flag = 0;
int match_num = 0;
int match_num_pointer = 0;
/*算出R是几位数,下方去模运算用*/
weight_R = Cal_Weight(R);
for (int i=0; i < Len_I; i++ )
{
temp = I[i];
while(temp >= R)
{
if (R == (temp % weight_R))
{
if (!match_flag)
{
match_flag = 1;
Output[++Total] = R;
match_num_pointer = Total + 1;
Total++;
}
Output[++Total] = i;
Output[++Total] = I[i];
match_num++;
break;
}
temp = temp / 10;
if (!temp) break;
}
}
Output[match_num_pointer] = match_num;
}
#include <stdio.h>
#include <string.h>
void px(int *r, int *gs){//排序
for(int i=0;i<*gs-1;i++){
for(int j=0;j<*gs-i-1;j++){
int c=0;
if(r[j]>r[j+1]){
c=r[j];
r[j]=r[j+1];
r[j+1]=c;
}
}
}
}
void qc(int *r,int *gs){//去重
for(int i=0;i<*gs;i++){
for(int j=i+1;j<*gs;j++){
if(r[i]==r[j]){
r[j]=r[*gs-1];
*gs-=1;
}
}
}
}
int bh(int a,int b){//包含
int res=0;
int b_num=0;
int b_kvalue=1;
int b2=b;
//printf("a:%d b:%d \n",a,b);
while(b2)
{
b2=b2/10;
b_kvalue=b_kvalue*10; //判断b是几位数字, 则b_kvalue为多少: 如 b=47, b_kvalue为100
b_num++;
}
while(a>0)
{
if(b){
if(a%b_kvalue==b)
{
res=1;
return res;
}
a=a/10;
}
if(!b){
if(a%10==b)
{
res=1;
return res;
}
a=a/10;
}
}
return res;
}
int main(){
char next2='\n';
char next1=' ';
while(next2=='\n'){
int flage=0;
int r[100]={0};
int l[100]={0};
int gs_r=0,gs_l=0;
int sc_r[100]={0},sc_l[100][100]={0},sc_l_pos[100][100]={0};
int sc_r_count=0,sc_l_count=0;
int sum=0,div=0;
int i_arr[100];
int l_sum=0;
//int len_r=0,len_l=0;
scanf("%d",&gs_l);
if(gs_l==0) break;
for(int i=0;i<gs_l;i++){
scanf("%d",&l[i]);
}
scanf("%d",&gs_r);
for(int i=0;i<gs_r;i++){
scanf("%d",&r[i]);
}
qc(&r, &gs_r);
px(&r, &gs_r);
for(int i=0;i<gs_r;i++){//r[i]
sc_r[sc_r_count]=r[i];
for(int j=0;j<gs_l;j++){//l[j]
if(bh(l[j],r[i] )==1){
sc_l[sc_r_count][sc_l_count]=l[j];
sc_l_pos[sc_r_count][sc_l_count]=j;
sc_l_count++;
flage=1;
}
}
i_arr[sc_r_count]=sc_l_count;
sc_l_count=0;
if(flage){
sc_r_count++;
flage=0;
}
}
for(int i=0;i<sc_r_count;i++){//r[i]
sum+=i_arr[i];
}
printf("%d ",(sum+sc_r_count)*2);
for(int i=0;i<sc_r_count;i++){//sc_r[i]
printf("%d %d ",sc_r[i],i_arr[i]);
for(int j=0;j<i_arr[i];j++){//sc_l[j]
printf("%d %d ",sc_l_pos[i][j],sc_l[i][j]);
}
}
printf("\n");
scanf("%c%c",&next1,&next2);
}
return 0;
}