就是模拟,先去除去重复的情况,再除去一个串为另一个串的后缀的情况,不过也学了一下set的用法和substr函数的用法,a.substr(pos,len)表示从字符串a第pos位开始取长度为len的子串。
#include<bits/stdc++.h>
using namespace std;
map<string,int>mp1;
map<int,string>mp2;
set<string>set1[25];
vector<string>v[25];
bool judge(string a,string b)
{
int len=b.size()-a.size();
if(len<=0) return false;
if(b.substr(len,a.size())==a)
return true;
return false;
}
int main()
{
set<string>::iterator it1,it2;
int n,cnt=0;
string name,num,name1,name2;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>name;
if(!mp1[name])
{
mp1[name]=++cnt;
mp2[cnt]=name;
}
int k;
cin>>k;
for(int i=1;i<=k;i++)
{
cin>>num;
set1[mp1[name]].insert(num);
}
}
int flag;
for(int i=1;i<=cnt;i++)
{
for(it1=set1[i].begin();it1!=set1[i].end();it1++)
{
flag=0;
for(it2=set1[i].begin();it2!=set1[i].end();it2++)
{
name1=*it1;
name2=*it2;
if(name1==name2) continue;
if(judge(name1,name2))
{
flag=1;
break;
}
}
if(!flag)
{
v[i].push_back(name1);
}
}
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)
{
cout<<mp2[i]<<" ";
cout<<v[i].size()<<" ";
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
return 0;
}