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

线段树牛人代码一份:

1511: ADERA 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;

}

 

你可能感兴趣的:(ad)