题解 | #数据分类处理#
数据分类处理
https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd
#include <stdio.h>
#include <string.h>
int main() {
// 输入
int In,Rn,i,j,k,l,t;
scanf("%d",&In); char I[In][100];
for(i=0;i<In;i++) scanf("%s",I[i]);
scanf("%d",&Rn); int R1[Rn];
for(i=0;i<Rn;i++) scanf("%d",&R1[i]);
// R1排序并去重复
for(i=0;i<Rn-1;i++)
for(j=0;j<Rn-i-1;j++)
if(R1[j]>R1[j+1]){
t=R1[j];
R1[j]=R1[j+1];
R1[j+1]=t;
}
for(i=0;i<Rn-1;i++)
if(R1[i]==R1[i+1]){
for(j=i;j<Rn;j++)
R1[j]=R1[j+1];
Rn--;i--;
}
// 把R1变成字符数组R,方便后续比较
char R[Rn][4]; memset(R,0,sizeof(R));
for(i=0;i<Rn;i++)
sprintf(R[i],"%d",R1[i]);
// 开始匹配,求出一个最大的匹配数,及各自的匹配数,及位置;
int view[Rn][In+1],count; memset(view,0,sizeof(view));
for(i=0;i<Rn;i++){//R从第一个数开始匹配
count=0;
for(j=0;j<In;j++){//I从第一个数开始匹配
for(k=0;k<strlen(I[j]);k++){//I的每个数的第一个字符开始检索
t=-1;//状态数字,表示未匹配上
if(I[j][k]==R[i][0]){//当存在第一个字符相同的时候,开始检验整个字符段是否完全相同
t=0;//表示开始匹配了
for(l=1;l<strlen(R[i]);l++)
if(I[j][k+l]!=R[i][l]||k+l==strlen(I[j])){
t=1;break;} //表示如果有不同或者有一个到了头,数不够,就未匹配上,改变状态数字
if(t==0) {count++;view[i][j]=1;break;}//如果状态数字没变代表匹配上了,匹配到的数组信息储存在哈希数组的j里,跳出
}
}
}
view[i][In]=count;//用这个表示每个r匹配到的数的数量
}
//下面就是求总的并输出了
int all=0;
for(i=0;i<Rn;i++)
if(view[i][In]!=0) all+=view[i][In]*2+2;
printf("%d ",all);
for(i=0;i<Rn;i++)
if(view[i][In]!=0){
printf("%s %d ",R[i],view[i][In]);
for(j=0;j<In;j++)
if(view[i][j]!=0)
printf("%d %s ",j,I[j]);
}
return 0;
}


查看22道真题和解析