zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    C语言学习11(循环结构:for语句)
    C语言学习9(循环结构:while语句)
    C语言学习8(选择结构的嵌套)
    C语言学习笔记2
    C语言学习笔记1
    C语言的学习5(数据的输出)
    C语言学习12(函数的定义)
    第二十一章流 14临时文件 简单
    第二十一章流 12输出数据到文件指定位置处seekp() 简单
    第二十一章流 11指定读取文件中的数据seekg() 简单
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3054710.html
Copyright © 2011-2022 走看看