题解 | #数据分类处理#
数据分类处理
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; }