初赛第五场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\n",sum);
43     }
44     return 0;
45 }

 

posted on 2017-06-06 21:43  hhhhx  阅读(351)  评论(0编辑  收藏  举报

导航