Phone Numbers
题面


题目描述
给你n个条目,每一个条目包含3个信息(名字+电话数目+电话)
例如:ivan 3 123 123 456
ivan(名字) 3(电话数目) 123(电话1) 123(电话2) 456(电话3)
然后对于给定的n个条目需要做3个处理
处理1:每个条目不能存在一个号码的后缀是另一个号码。
例如:ivan 4 123 23 34 3
23和3是123的后缀,所以需要把23和3剔除
处理2:所有条目中如果存在相同的名字,就需要统一化
例如:
ivan 2 123 34
ivan 3 12 45 86
统一化之后:ivan 5 123 34 12 45 86
处理3:对于所有统一化之后的条目再进行一次处理1

最后输出所有条目:具体可见样例
题目分析
做法已经在题目描述中叙述过,具体实现过程在这个模块详细介绍
对于处理1,怎样设计代码呢?
必备知识点string(c++)用法
在这里简单介绍一下rfind用法
string a=“12345”,b=“45”;
a.rfind(b);//该值为3(a[3]=4 a[4]=5)

string pn[202];//这个只是举例怎样解觉处理1的问题,记录每一个条目的所有号码
for(i=1;i<=num;i++)
     cin>>pn[i];
 //输入
 for(i=1;i<=num;i++){
      for(j=1;j<i;j++){
      if(p[i].length()<=p[j].length()){
      if(p[j].rfind(p[i])==p[j].length()-p[i].length())
            p[i].erase();
      }
      else{
       if(p[i].rfind(p[j])==p[i].length()-p[j].length())
            p[j].erase();
      }
      }
}//到时候输出的时候加一个特判(号码的长度==0 continue)

对于处理2,怎样设计代码呢?

struct{
string name;
int num;
string pn[202];
}p[22];
for(i=1;i<n;i++){
    for(j=i+1;j<=n;j++){
         cnt=0;
         if(p[j].name.length()==0)  continue;
        if(p[j].name!=p[i].name)
              continue;
       p[j].name.erase();
            cnt=p[j].num;
        for(q=1;q<=cnt;q++){
          p[i].pn[(++(p[i].num))]=p[j].pn[q];
}
}
}

处理3可以综合以上两个实现方法

AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
struct{
string name;
int num;
string pn[202];
}p[22];
int main(){
int n,i,j,q,cnt=0,ans=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>p[i].name>>p[i].num;
 for(j=1;j<=p[i].num;j++){
               cin>>p[i].pn[j];
            for(q=1;q<j;q++) {
			if(p[i].pn[q].length()==0)  continue;
                 if(p[i].pn[j].length()<=p[i].pn[q].length())
                       {if(p[i].pn[q].rfind(p[i].pn[j])==p[i].pn[q].length()-p[i].pn[j].length())
                           { p[i].pn[j].erase();}
                           }
            else{
                      if(p[i].pn[j].rfind(p[i].pn[q])==p[i].pn[j].length()-p[i].pn[q].length())
                           {  p[i].pn[q].erase();}
                 }
            }
        }
}
for(i=1;i<n;i++){
    for(j=i+1;j<=n;j++){
         cnt=0;
         if(p[j].name.length()==0)  continue;
        if(p[j].name!=p[i].name)
              continue;
       p[j].name.erase();
            cnt=p[j].num;
        for(q=1;q<=cnt;q++){
          p[i].pn[(++(p[i].num))]=p[j].pn[q];
}
}
}
for(i=1;i<=n;i++){
 for(j=1;j<=p[i].num;j++){
 	if(p[i].pn[j].length()==0)  continue;
            for(q=1;q<j;q++) {
			if(p[i].pn[q].length()==0)  continue;
                 if(p[i].pn[j].length()<=p[i].pn[q].length())
                       {if(p[i].pn[q].rfind(p[i].pn[j])==p[i].pn[q].length()-p[i].pn[j].length())
                           {   p[i].pn[j].erase();} }
              else{
                      if(p[i].pn[j].rfind(p[i].pn[q])==p[i].pn[j].length()-p[i].pn[q].length())
                           {   p[i].pn[q].erase();}
                 }
            }
        }
}
for(i=1;i<=n;i++){
if(p[i].name.length()==0) continue;
ans++;
cnt=0;
for(j=1;j<=p[i].num;j++)
 if(p[i].pn[j].length())  cnt++;
p[i].num=cnt;
}
cout<<ans<<endl;
for(i=1;i<=n;i++){
if(p[i].name.length()==0) continue;
cout<<p[i].name<<' '<<p[i].num<<' ';
for(j=1;j<=201;j++){
  if(p[i].pn[j].length()==0)  continue;
cout<<p[i].pn[j]<<' ';}
putchar('\n');
}
return 0;
}