题意:
给你每个名字对应的几个号码,如果一个号码是另一个号码的后缀,那么这个号码就不输出。
POINT:
给每个人的号码【反过来】先排个序,是不是后缀可以简单的判断一下相邻的了。
#include <iostream>
#include <string>
#include <string.h>
#include <math.h>
#include <vector>
#include <map>
#include <stdio.h>
#include <algorithm>
using namespace std;
map<string,int>p;
map<int,string> na;
map<string,int>pnum[22];
string ps[22][222];
int c[22];
bool cmd(string a,string b)
{
return a<b;
}
int main()
{
int n;
int cnt=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
string name;
cin>>name;
if(p[name]==0){
p[name]=++cnt;
na[cnt]=name;
}
int now=p[name];
int num;scanf("%d",&num);
for(int i=1;i<=num;i++){
string number;
cin>>number;
reverse(number.begin(), number.end());
if(pnum[now][number]==0){
ps[now][++c[now]]=number;
pnum[now][number]=1;
}
}
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++){
int ci=0;
string ans[222];
sort(ps[i]+1,ps[i]+1+c[i],cmd);
for(int j=1;j<c[i];j++){
//cout<<ps[i][j]<<" ";
string now=ps[i][j+1].substr(0,min(ps[i][j+1].length(),ps[i][j].length()));
if(ps[i][j]==now){
continue;
}else{
ci++;
ans[ci]=ps[i][j];
}
}
ans[++ci]=ps[i][c[i]];
cout<<na[i];
printf(" %d",ci);
for(int j=1;j<=ci;j++){
reverse(ans[j].begin(), ans[j].end());
cout<<" "<<ans[j];
}
cout<<endl;
}
}