1511: ADERA
#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
线段树牛人代码一份:
View Code
#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; }