zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/hhxj/p/7610820.html
Copyright © 2011-2022 走看看