2020年冬休み[gmoj1921] [自動自動一致] [2点] [文字列]

タイトルの説明

牛ベリスは最近新しい携帯電話を持っていたので、彼はしばしばテキストを送った。しかし、電話画面が小さすぎて爪が大きすぎたため、間違った単語を入力することがよくありました((⊙o⊙))。ファーマージョンは、不完全な単語から単語全体を推測できるように、アプリの開発を支援することにしました。
アプリアプリケーションはWワードで構成され、各ワードは「a」...「z」で構成されます。これらのワードの全長は1000000を超えません。現在、合計N個の不完全な単語があり、各単語の次数は1000を超えません。i番目の不完全な単語S_iの場合、アプリアプリケーションは、単語ライブラリでプレフィックスS_iが付いた辞書順に並べられたK_i単語を計算する必要があります。あなたはあなた自身の接頭辞であることに注意してください。

入力

最初の行は2つの正の整数WとNです。
次のW行では、各行に辞書ライブラリの単語が含まれています。
それぞれがK_iとそれに対応する不完全な単語S_iを含む次のN行を取ります。

アウトプット

出力にはN行が含まれます。i番目の行の場合、元の辞書ライブラリのプレフィックスS_iを満たす辞書ライブラリのK_iワードの辞書式順序を出力します。単語が足りない場合は-1を出力します。

入力例

10 3 
dab 
ba 
ab 
daa 
aa 
aaa 
aab 
abc 
ac 
dadba 
4 a 
2 da 
4 da

出力例

 3
 1
 -1

データ範囲の制限

辞書ライブラリ内の単語の全長は1000000、1 <= N <= 1000を超えず、各不完全な単語の長さは1000を超えません。
W <= 30000。

プロンプト

[サンプルの説明]
接頭辞aの付いた単語はaa、aaa、aab、ab、abc、acで、4番目はab、abは元の辞書ライブラリの3番目です。daで始まる単語はdaa、dab、dadba、2番目はdab、最初は元の辞書ライブラリの最初の単語です。da接頭辞がdaである単語がないため、-1が出力されます。

分析

この質問の冒頭では、暴力を振るうには10点しかありませんでした。その後、映画の始めの兄貴に行きますが、直接軽蔑されました。
次に、分割が2点であることがわかりました幸いにもc ++にはさわやかなlower_boundがあります。
この構造では、最初に配列とランキングが記録され、次に辞書式順序でソートされます。配列を取り、ソートされた配列をコピーします。次に、c(接頭辞)ごとに、最初に出現した位置を見つけ、次にxを追加します(そのような接頭辞の数を示します)。そのため、位置の接頭辞のと同じ種類が一緒でなければなりませんそのような文字列がある場合は出力され、それ以外の場合は-1になります。

コードオン

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int w,n,x;
string c,ff[30001];
struct node
{
	int p;string st;
}a[30001];//结构体不说
int cmp(node x,node y)
{
	return x.st<y.st;//以st为关键字排序
}
int main()
{
	freopen("auto.in","r",stdin);
	freopen("auto.out","w",stdout);
    cin>>w>>n;
    for(register int i=1;i<=w;i++)
    {
    	cin>>a[i].st;
    	a[i].p=i;//记录排名
	}
	sort(a,a+w+1,cmp);
	for(int i=1;i<=w;i++)
	{
		ff[i]=a[i].st;//复制数组
	}
	for(int i=1;i<=n;i++)
	{
		cin>>x;cin>>c;
	    int l=lower_bound(ff+1,ff+w+1,c)-ff;//在字典里二分找c 
	    l=l+x-1;//加上x个位置
	    if(l>w)
	    {
	    	cout<<-1<<endl;
	    	continue;
		}
		if(!ff[l].find(c,0))//在第x个串查找有没有
		{
			cout<<a[l].p<<endl;
		}
		else cout<<-1<<endl;
	}
	fclose(stdin);
	fclose(stdout);	
    return 0;
}

元の記事を110件公開 100 件を獲得 8027を訪問

おすすめ

転載: blog.csdn.net/dglyr/article/details/104848753