• 初赛第五场B


    每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作。作为一家安全可信的云计算平台,秘钥的安全性至关重要。因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下:

    首先,定义两个由数字序列组成的秘钥 ab 近似匹配(≈approx≈) 的关系。ab 近似匹配当且仅当同时满足以下两个条件:

    • ∣a∣=∣b∣,即 aaa 串和 bbb 串长度相等。
    • 对于每种数字 cca中出现的次数等于 c 在b 中出现的次数。

    此时,我们就称 ab近似匹配,即 a≈b。例如,(1,3,1,1,2)≈(2,1,3,1,1)(1,3,1,1,2)(2,1,3,1,1)。

    UCloud 每年会收集若干不安全秘钥,这些秘钥组成了不安全秘钥集合 TTT。对于一个秘钥 sss 和集合 TTT 中的秘钥 ttt 来说,它们的相似值定义为:sss 的所有连续子串中与 ttt 近似匹配的个数。相似值越高,说明秘钥 sss 越不安全。对于不安全秘钥集合 TTT 中的每个秘钥 ttt,你需要输出它和秘钥 sss 的相似值,用来对用户秘钥的安全性进行分析。

    输入格式

    第一行包含一个正整数 n,表示 s 串的长度。

    第二行包含 n 个正整数 s1,s2,...,sn(1≤si≤n)1​​,s2​​,...,sn​​(1si​​n),表示 sss 串。

    接下来一行包含一个正整数 m,表示询问的个数。

    接下来 m个部分:

    每个部分第一行包含一个正整数 k(1≤k≤n),表示每个 t 串的长度。

    每个部分第二行包含 k 个正整数 t1,t2,...,tk(1≤ti≤n)1​​,t2​​,...,tk​​(1ti​​n),表示 TTT 中的一个串 ttt。

    输入数据保证 TT中所有串长度之和不超过 200000

    对于简单版本:1≤n,m≤1001

    对于中等版本:1≤n≤50000,1≤m≤5001

    对于困难版本:1≤n≤50000,1≤m≤100000

    输出格式

    输出 m 行,每行一个整数,即与 T 中每个串 t 近似匹配的 s 的子串数量。

    样例解释

    对于第一个询问,(3,2,1,3)≈(2,3,1,3)(3,2,1,3)≈(3,1,3,2)(3,2,1,3)

    对于第二个询问,(1,3)≈(3,1),(1,3)(1,3);

    对于第三个询问,(3,2)≈(2,3),(3,2)≈(3,2)

    样例输入

    5
    2 3 1 3 2
    3
    4
    3 2 1 3
    2
    1 3
    2
    3 2

    样例输出

    2
    2
    2

    思路:B暴力就可以了,貌似我又写崩了
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int c[103][103];
     4 int d[103];
     5 map<int ,int >a,b;
     6 int main(){
     7     int n,m;
     8     scanf("%d",&n);
     9     int x;
    10     int MMax=0;
    11     for(int i=1;i<=n;i++){
    12        scanf("%d",&d[i]);
    13        MMax=max(MMax,d[i]);
    14     }
    15     int q;
    16     scanf("%d",&q);
    17     for(int ii=1;ii<=q;ii++){
    18         int Max=MMax;
    19         scanf("%d",&m);
    20         a.clear();b.clear();
    21         for(int i=1;i<=m;i++){
    22             scanf("%d",&x);
    23             b[x]++;
    24             Max=max(Max,x);
    25         }
    26         int sum=0;
    27         int t;
    28         for(int i=1;i<=m;i++) a[d[i]]++;
    29         for(int i=m;i<=n;i++){
    30             if(i!=m) {
    31                     a[d[i]]++;
    32                     a[d[i-m]]--;
    33             }
    34             t=0;
    35             for(int j=0;j<=Max;j++){
    36                 if(a[j]!=b[j]){
    37                     t=1;break;
    38                 }
    39             }
    40             if(!t) sum++;
    41         }
    42         printf("%d
    ",sum);
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    SQLite Java Wrapper/JDBC Driver(收集)
    JAVA 并行运行(收集)
    log4net使用方法(转载)
    WMI服务故障,VBS脚本无法运行错误
    ArcEngine中UID使用资料收集
    使用 ArcGIS Engine Runtime 制作安装包(转载)
    Eclipse安装WindowBuilder Pro(转载)
    C#操作SQL Server数据库
    自动化测试 (三) Web自动化测试原理
    HTTP协议 (六) 状态码详解
  • 原文地址:https://www.cnblogs.com/hhxj/p/6953809.html
Copyright © 2020-2023  润新知