A.シャッフルハッシュ-------思考(水)

polycarpは、彼自身のWebサービスを構築しています。最近のWebサービスであること、それは、ログイン機能が含まれています。そしてそれは常にパスワードのセキュリティ上の問題を意味します。

polycarpは、次のアルゴリズムによって生成されたパスワードのハッシュを保存することを決めました。

'(p'はまだPに等しくすることができる)小文字のラテン文字から成る、パスワードpを取り、そしてpを取得することで、ランダムに文字をシャッフル。
小文字のラテン文字からなる、2つのランダムな文字列を生成し、S1とS2(これらの文字列のいずれかが空であることができます)。
添加が文字列連結で得られたハッシュH = S1 + P '+ S2、。
たとえば、パスワードp =「abacaba」をしましょう。そして、p 'は「aabcaab」に等しくすることができます。ランダム文字列S1 =「ZYX」とs2 =「KJH」。そして、H =「zyxaabcaabkjh」。

何の文字が削除されていないまたはp 'を得るためにPに加えることができることを注記は、唯一の順序を変更することができます。

今のpolycarpは、パスワードチェックモジュールを実装するために彼を助けるためにお願いします。パスワードpとハッシュhを考えると、hはパスワードpのハッシュことができることを確認してください。

あなたのプログラムは、独立したテストケースをt答える必要があります。

入力
テストケースの数-最初の行は1つの整数T(1≤t≤100)を含みます。

各テストケースの最初の行には、小文字のラテン文字からなる非空の文字列Pを含有します。Pの長さは100を超えません。

各テストケースの2行目は、小文字のラテン文字からなる非空の文字列Hを含有します。時間の長さは100を超えません。

出力
各テストケースの場合は、それに対する回答を印刷する- 「YES」ならば与えられたハッシュhが与えられたパスワードpから得ることができるか、そうでない場合は「NO」。

例えば
inputCopy

5
abacaba
zyxaabcaabkjh
onetwothree
threetwoone
1
zzonneyy
1
なし
20
10
outputCopy
YES
YES
NO
YES
NO

最初のテストケース文で説明されています。

第二のテストケースの両方s1とs2の空およびp '=「threetwoone」でpはシャッフルされます。

第3のテストケースにハッシュパスワードから得ることができませんでした。

第四のテストケースS1 =「n」は、S2で空とp '=「1」であり、pは(たとえそれが同じ滞在考え)シャッフルされます。

第五テストケースでは、ハッシュは、パスワードから取得することができませんでした。

あなたのpのシーケンスを与えるために、p 'はp型かく乱シーケンスで、H = S1 + P' + S2:質問が意図されます。+手段が接続されている場合。今、あなたはあなたがpを得ることができるかどうかをpとH、Hチェックを与える対象をお願いします。

分析:データが最小であるので、この質問は、長い間暴力などのように、ライン上にあります。三つのケース
配列の長さは、P N、H、配列mの長さである
第M <N NO肯定結果
第二M == N自体がチェックされていません。
ライン横断暴力第3 N> M

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
int t;
char s[N],str[N];
map<char,int> v,res;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>(s+1)>>(str+1);
		v.clear();res.clear();
		int n=strlen(s+1);
		int m=strlen(str+1);
		for(int i=1;i<=n;i++) v[s[i]]++;
		if(m<n)
		{
			puts("NO");
			continue;
		}
		if(m==n)
		{
			for(int i=1;i<=m;i++) res[str[i]]++;
			int f=1;
			for(int i=1;i<=m;i++)
			{
				if(v[s[i]]!=res[s[i]])
				{
					f=0;
					break;
				}
			 } 
			if(f==1) 
				puts("YES");
			else puts("NO");
			continue;
		}
		int f=1;
		for(int i=1;i<=m-n+1;i++)
		{
			res.clear();
			for(int j=i;j<=i+n-1;j++) res[str[j]]++;
			 f=1;
			for(int j=1;j<=n;j++)
			{
				if(v[s[j]]!=res[s[j]])
				{
					f=0;
					break;
				}
			}
			if(f==1) 
			{
				puts("YES");
				break;
			}
			    
		}
		if(f==0) puts("NO");
	}
 } 

公開された309元の記事 ウォンの賞賛6 ビュー5257

おすすめ

転載: blog.csdn.net/qq_43690454/article/details/104079485