题目大意
问有多少不同的人以及每个人有多少种不同号码,一个串是另一个后缀则算相同号码。
题解
先将相同的人的电话合并,然后暴力去重就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
char ch=getchar();int f=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') {f=f*10+(ch^48);ch=getchar();}
return f;
}
struct data
{
string name;
int size;
string num[505];
int ans;
}a[55],b[55];
int n,tot;bool vis[105];
bool cmp(string x,string y)
{
return x.length()>y.length();
}
bool check(string x,string y)
{
int l1=x.length(),l2=y.length();
for(int i=0;i<l2;i++)
{
if(y[i]!=x[l1-l2+i])
return 0;
}
return 1;
}
bool cmp2(data x,data y)
{
return x.name<y.name;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
cin>>a[i].name;
a[i].size=read();
for(int j=1;j<=a[i].size;j++)
{
cin>>a[i].num[j];
}
}
sort(a+1,a+n+1,cmp2);
for(int i=1;i<=n;i++)
{
if(a[i].name==a[i-1].name)
{
for(int j=1;j<=a[i].size;j++)
b[tot].num[++b[tot].size]=a[i].num[j];
}
else
{
b[++tot].name=a[i].name;
for(int j=1;j<=a[i].size;j++)
b[tot].num[++b[tot].size]=a[i].num[j];
}
}
cout<<tot<<endl;
for(int i=1;i<=tot;i++)
{
memset(vis,0,sizeof(vis));
sort(b[i].num+1,b[i].num+b[i].size+1,cmp);
for(int j=1;j<=b[i].size;j++)
{
if(!vis[j])
{
b[i].ans++;
for(int k=j+1;k<=b[i].size;k++)
{
if(check(b[i].num[j],b[i].num[k]))
{
vis[k]=1;
}
}
}
}
cout<<b[i].name<<" "<<b[i].ans<<" ";
for(int j=1;j<=b[i].size;j++)
{
if(!vis[j])
cout<<b[i].num[j]<<" ";
}
cout<<endl;
}
}