#include<stdio.h>
#include<algorithm>
#include<string>
#include<vector>
#include<deque>
#include<list>
#include<string.h>
#include<set>
#include<iostream>
using namespace std;
string s1,s2,si;
struct node
{
int ii;//物品编号
int value;//价值
set<string>s;//描述信息处理(并排序)
vector<string>v;//保存描述信息
} a[100005];
struct node2
{
int jj;
int value2;
}b[500005];
set<string>::iterator it;
vector<string>::iterator it1;
int cmp(node a,node b)
{
return a.value>b.value;//true;bool
}
int main()
{
int n,m,ni,t;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=0; i<n; i++)
{
//a[i].v.clear();
scanf("%d %d",&a[i].value,&ni);
a[i].ii=i;//物品编号
for(int j=0; j<ni; j++)
{
s1.clear();
cin>>s1;
a[i].v.push_back(s1);
}
}
sort(a,a+n,cmp);//按物品价值排序
//for(int i=0;i<n;i++)
//printf("%d##\n",a[i].value);
for(int i=0; i<m; i++)
{
scanf("%d",&t);
s2.clear();
cin>>s2;
int js=0;
memset(b,0,sizeof(b));
for(int k=0; k<n; k++)
{
//a[k].s.clear();
for(it1=a[k].v.begin(); it1!=a[k].v.end(); it1++)
//while(!a[k].v.empty())
{
si.clear();
si=*it1;
//a[k].v.pop();
if(si.size()>s2.size())
si.erase(si.begin()+s2.size(),si.end());
//si+='\n';
a[k].s.insert(si);
//(*it).erase((*it).begin()+s2.size(),(*it).end());
}
if(a[k].s.find(s2)!=a[k].s.end())
{
b[js].jj=a[k].ii;
b[js++].value2=a[k].value;
}
//break;
/*{
si=*it;
if(si.find(s2)==0)
{
b[js].jj=a[k].ii;
b[js++].value2=a[k].value;
break;
}
}*/
//if(js==t)break;
}
//printf("%d**\n",t);
printf("%d",js);
js=min(js,t);
for(int k=0;k<js;k++)
printf(" %d",b[k].jj);
printf("\n");
}
}
return 0;
}
http://www.acmore.net/problem.php?id=1511
线段树牛人代码一份:


#include<iostream> #include<algorithm> #include<set> #include<cstdio> #include<cstring> using namespace std; const int maxn=100010; int tot=1; int son[maxn][26]; int a[maxn]; char s[maxn]; struct cmp{ bool operator()(const int &x,const int &y){ return a[x]>a[y]; } }; typedef set<int,cmp> sint; sint S[maxn]; void add(int num){ int p=1,n=strlen(s),i,c; for(i=0;i<n;++i){ c=s[i]-'a'; if(!son[p][c]) son[p][c]=++tot; p=son[p][c]; S[p].insert(num); } } int main(){ int n,m,k,i,w,p,c; scanf("%d%d",&n,&m); for(i=0;i<n;++i){ scanf("%d",a+i); for(scanf("%d",&k);k--;) scanf("%s",s),add(i); } while(m--){ scanf("%d%s",&w,s); n=strlen(s),p=1; for(int j=0;j<n;++j) p=son[p][s[j]-'a']; sint &S=::S[p]; printf("%d",S.size()); for(sint::iterator it=S.begin();w&&it!=S.end();++it) printf(" %d",*it),--w; puts(""); } return 0; }