哈希UVALive 6326 Contest Hall Preparation

 
 
 
 
 
 
 

 
 
 
 
 
 
Encrypting passwords is one of the most important problems nowadays, and you trust only the encryp-
tion algorithms which you invented, and you have just made a new encryption algorithm.
Given a password which consists of only lower case English letters, your algorithm encrypts this
password using the following 3 steps (in this given order):
1.
Swap two different characters of the given password (you can do this step zero or more times).
2.
Append zero or more lower case English letters at the beginning of the output of step one.
3.
Append zero or more lower case English letters to the end of the output of step two.
And the encrypted password is the output of step three.
You have just nished implementing the above algorithm and applied it on many passwords. Now
you want to make sure that there are no bugs in your implementation, so you decided to write another
program which validates the output of the encryption program. Given the encrypted password and the
original password, your job is to check whether the encrypted password may be the result of applying
your algorithm on the original password or not.
Input
Your program will be tested on one or more test cases. The rst line of the input will be a single
integer
T
, the number of test cases (1
T
100). Followed by the test cases, each test case is on two
lines. The rst line of each test case contains the encrypted password. The second line of each test case
contains the original password. Both the encrypted password and the original password are at least 1
and at most 100,000 lower case English letters (from `
a
' to `
z
'), and the length of the original password
is less than or equal the length of the encrypted password.
Output
For each test case, print on a single line one word, `
YES
' (without the quotes) if applying the algorithm on
the original password may generate the encrypted password, otherwise print `
NO
' (without the quotes).
SampleOutput
3
abcdef
ecd
cde
ecd
abcdef
fed
SampleOutput
YES
YES
NO//有坑
 
 
 
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000;
int hash[maxn];
int cur[maxn];
char s[100005],t[100005];
int h[100005];
int main()
{
    int T;
    scanf("%d",&T);
    getchar();
    while(T--)
    {
        memset(h,0,sizeof(h));
        memset(hash,0,sizeof(hash));
        memset(cur,0,sizeof(cur));
        memset(t,0,sizeof(t));
        memset(s,0,sizeof(s));
        scanf("%s",t);
        getchar();
        scanf("%s",s);
        getchar();
        int len1=strlen(s);
        int len2=strlen(t);

        for(int i=0; i<len1; i++)
        {
            int temp=s[i];
            hash[temp]++;
        }

        int ans=0;
        int cnt=0;
        bool flag=false;
        if(len1==len2)
        {
            for(int i=0; i<len2; i++)
            {
                int d=t[i];
                h[i]=d;
                if(cur[d]<hash[d])
                    cnt++;
                cur[d]++;
                if(cnt==len1){
                    flag=true;
                      break;
                    }
            }
        }


        else
        {
            for(int i=0; i<len2; i++)
            {

                int d=t[i];
                h[i]=d;
                if(cur[d]<hash[d])
                    cnt++;
                cur[d]++;

                if(i>=len1)
                {
                    d=h[i-len1];
                    if(cur[d]<=hash[d])
                        cnt--;
                    cur[d]--;

                }
                if(cnt==len1){
                    flag=true;
                      break;
                    }

            }
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

 

 
 
 
 
 

转载于:https://www.cnblogs.com/13224ACMer/p/4692962.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值