• hdu 5968 异或密码


    异或密码

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 1758    Accepted Submission(s): 577


    Problem Description
    晨晨在纸上写了一个长度为N的非负整数序列{ai}。对于这个序列的一个连续子序列{al,al+1,ar}晨晨可以求出其中所有数异或的结果 alxoral+1xor...xorar其 中xor表示位异或运算,对应C、C++、 Java等语言中的^运算。
    小璐提出了M个询问,每个询问用一个整数 xi描述。
    对于每个询问,晨晨需要找到序列{ai}的所有连续子序列,求出每个子序列异或的结果,找到所有的结果中与 xi之差的绝对值最小的一个,并告诉小璐相应子序列的长度。
    若有多个满足条件的连续子序列,则告诉小璐这些子序列中最长的长度。
     
    Input
    包含多组测试数据,第一行一个正整数T,表示数据组数。
    每组数据共两行。
    第一行包含N+1个非负整数。其中第一个数为N,表示序列的长度;接下来N 个数,依次描述序列{ ai}中的每个数。
    第二行包含M+1个整数。其中第一个数为M,表示询问的个数;接下来M个数 xi,每个数对应题目描述中的一个询问。
    保证 1 <= N <= 100,1 <= M <= 100,ai <= 1024,|xi| <= 1024,数据组数 <= 100。
     
    Output
    对于每组数据输出M + 1行。前M行对应晨晨M个询问的回答,第M + 1行为空行
     
    Sample Input
    2 2 1 1 2 0 2 3 1 2 4 3 10 5 1
     
    Sample Output
    2 1 3 2 1
     

     思路:暴力

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=105;
     4 
     5 int a[N];
     6 int n;
     7 set<int > s[2100],ss;
     8 set<int >::iterator it,it1,it2;
     9 int main(){
    10     int  t;
    11     cin>>t;
    12     while(t--){
    13         scanf("%d",&n);
    14         ss.clear();
    15         for(int i=0;i<=2100;i++) s[i].clear();
    16         for(int i=1;i<=n;i++){
    17             scanf("%d",&a[i]);
    18             s[a[i]].insert(1);
    19             ss.insert(a[i]);
    20         }
    21         for(int i=1;i<=n;i++){
    22             int x=a[i];
    23             for(int j=i+1;j<=n;j++){
    24                 x=x^a[j];
    25                 ss.insert(x);
    26                 if(!s[x].empty()){
    27                     if(*s[x].begin()<(j-i+1)){
    28                         int y=*s[x].begin();
    29                         s[x].erase(y);
    30                         s[x].insert(j-i+1);
    31                     }
    32                 }
    33                 else
    34                 s[x].insert(j-i+1);
    35             }
    36         }
    37         int q;
    38         scanf("%d",&q);
    39         while(q--){
    40             int m;
    41             scanf("%d",&m);
    42             it=ss.upper_bound(m);
    43             if(it!=ss.end()){
    44                 int xx=*it;
    45                 if(it!=ss.begin()){
    46                     it--;
    47                     int yy=*it;
    48                     if(abs(yy-m)<abs(xx-m)){
    49                         printf("%d
    ",*(s[yy].begin()));
    50                     }
    51                     else if(abs(yy-m)>abs(xx-m)){
    52                         printf("%d
    ",*(s[xx].begin()));
    53                     }
    54                     else {
    55                             printf("%d
    ",max(*(s[xx].begin()),*(s[yy].begin())));
    56                     }
    57                 }
    58                 else {
    59                     printf("%d
    ",*(s[xx].begin()));
    60                 }
    61             }
    62             else {
    63                 it--;
    64                 printf("%d
    ",*(s[*it].begin()));
    65             }
    66         }
    67         printf("
    ");
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.2.更换主题
    【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.1.CSS框架和其他功能
    终于要开始做大名鼎鼎的BombLab了!
    初识linux内核漏洞利用
    控制转移指令分类与机器码
    Kali Linux信息收集工具全集
    Kali Linux 弱点分析工具全集
    DockerScan:Docker安全分析&测试工具
    SNORT入侵检测系统
    Woobuntu
  • 原文地址:https://www.cnblogs.com/hhxj/p/7610820.html
Copyright © 2020-2023  润新知