1 solutions

  • 0
    @ 2025-11-5 15:15:08

    C++ :

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<map>
    using namespace std;
    map<string,int> m;
    typedef map<string,int>::iterator sit;
    typedef pair<string,int> mypair;
    string s;
    sit it;
    int w,n;
    int main(){
    //	ios::sync_with_stdio(false);	
    	int i,x;
    	cin>>w>>n;
    	getchar();
    	for(i=1;i<=w;++i)
    	{
    	  getline(cin,s);
    	  m.insert(  mypair (s,i));
        }
        for(i=1;i<=n;++i){
        	scanf("%d",&x);
        	getchar();
        	getline(cin,s);
        	it=m.lower_bound(s);
        	if (it==m.end() || it->first.substr(0,s.size())!=s) cout<<-1<<endl; 
        	else{
        		bool flag=false;
        		x--;
        		while(x--)	
    			  {
    			      it++;
    			      if (it==m.end()) 
    				   {
    				    cout<<-1<<endl;
    				    flag=true;
    				    break;
    				   }
    		      }
    		    if (flag)continue;
        		if (it->first.substr(0,s.size())==s)
    			{ cout<<it->second<<endl;}
        		else cout<<-1<<endl;
        	}
        }
    }
    

    Pascal :

    var
      a:array[0..35005] of ansistring;
      b:array[0..35005] of longint;
      n,m:longint;
    procedure init;
    var i,j,t:longint;
        t1:ansistring;
    begin
     readln(n,m);
     for i:=1 to n do
       begin
        readln(a[i]);
    	b[i]:=i;
       end;
    end;
    
    procedure qsort(ll,rr:longint);
    var i,j,t:longint;
        t1,x:ansistring;
    begin
       i:=ll;j:=rr;x:=a[(ll+rr)>>1];
       repeat
         while a[i]<x do inc(i);
    	 while a[j]>x do dec(j);
    	 if i<=j then 
    	   begin
    	     t1:=a[i];a[i]:=a[j];a[j]:=t1;
    		 t:=b[i];b[i]:=b[j];b[j]:=t;
    		 inc(i);dec(j);
    	   end;
       until i>j;
       
       if ll<j then qsort(ll,j);
       if i<rr then qsort(i,rr);   
    end;
    
    function find(ll,rr:longint;tt:ansistring):longint;
    var mid:longint;
    begin
      if ll=rr then exit(ll);
      if ll=rr-1 then 
        begin
    	  if a[ll]>=tt then  exit(ll);
          exit(rr);	  
    	end;
      mid:=(ll+rr)>>1;
      if a[mid]>=tt then exit(find(ll,mid,tt))
                    else exit(find(mid+1,rr,tt));
    end;
    
    procedure main;
    var i,j,x,yy:longint;
       tt:ansistring;
       ww:char;
    
    begin
        qsort(1,n);
       for i:=1 to m do
         begin
    	    read(x);
    		read(ww);
    		readln(tt);
    		yy:=find(1,n,tt);
    		if pos(tt,a[yy])=1 then
    		                   begin
    						     yy:=yy+x-1;
    							 if pos(tt,a[yy])=1 then writeln(b[yy])
    							                    else writeln(-1);
    						   end
    						   else 
    						   begin
    						    writeln(-1);
    						   continue;
    						   end;
    	 end;
    end;
    
    begin
      init;main;
    end.
    
    
    • 1

    Information

    ID
    16570
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By