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;
}