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");
}
}