bzoj4750: 密码安全

Description

有些人在社交网络中使用过许多的密码,我们通过将各种形式的信息转化为 01 信号,再转化为整数,可以将这个

人在一段时间内使用过的密码视为一个长度为 n 的非负整数序列 A_1,A_2,...,A_n 。一个人相邻几次在社交网络

中使用的密码很有可能是类似的,这使得密码并不是足够安全。为了检验某些人在某些时间段内是否可能受到不安

全的影响,我们需要计算上述序列的复杂程度。

的值,这将作为我们评估密码复杂程度的一个部分。由于答案可能很大,你只需要给出答案对10^9+61 取模的值即可。

Input

第一行包含一个正整数 T ,表示有 T 组测试数据。

接下来依次给出每组测试数据。对于每组测试数据:

第一行包含一个正整数 n 。

第二行包含 n 个非负整数,表示 A_1,A_2,?,A_n 。

保证在一行中的每个整数之间有恰好一个空格,没有其他额外的空格。

100% 的数据满足:1≤T≤200,1≤n≤10^5,1≤∑n≤10^6,0≤A_i≤10^9

Output

对于每组数据输出一行,包含一个整数,表示答案对10^9+61 取模的值。

用单调栈预处理出每个a[x]作为最大值(值相同则比较位置)所出现的区间,具体形式是[l,r] | l in [ls[x],x], r in [x,rs[x]],于是可以按位处理然后前缀和一下对每个a[x]分别计算贡献

#include<cstdio>
typedef long long i64;
const int N=100007,P=1000000061;
char buf[15000007],*ptr=buf-1;
int _(){
    int x=0,f=1,c=*++ptr;
    while(c<48)c==‘-‘&&(f=-1),c=*++ptr;
    while(c>47)x=x*10+c-48,c=*++ptr;
    return x*f;
}
int T,n,a[N],ls[N],rs[N],ss[N],sp=0,s[N],ans;
int main(){
    buf[fread(buf,1,sizeof(buf),stdin)]=0;
    for(T=_();T;--T){
        n=_();
        for(int i=1;i<=n;++i)a[i]=_();
        for(int i=1;i<=n;++i){
            while(sp&&a[ss[sp]]<a[i])rs[ss[sp--]]=i-1;
            ss[++sp]=i;
        }
        while(sp)rs[ss[sp--]]=n;
        for(int i=n;i;--i){
            while(sp&&a[ss[sp]]<=a[i])ls[ss[sp--]]=i+1;
            ss[++sp]=i;
        }
        while(sp)ls[ss[sp--]]=1;
        ans=0;
        for(int i=0;i<30;++i){
            int sum=0;
            for(int j=1;j<=n;++j)s[j+1]=s[j]^(a[j]>>i&1);
            for(int j=1;j<=n;++j)s[j+1]+=s[j];
            for(int j=1,v1,v2;j<=n;++j){
                v1=s[rs[j]+1]-s[j];
                v2=s[j]-s[ls[j]-1];
                sum=(sum+(i64(v1)*(j+1-ls[j]-v2)+i64(v2)*(rs[j]+1-j-v1))%P*a[j])%P;
            }
            ans=(ans+(i64(sum)<<i)%P)%P;
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2025-01-05 18:27:41

bzoj4750: 密码安全的相关文章

2017-03-17 Codeforces 441D 置换群,好题 bzoj 4750 思维,按位计算

Codeforces 441D 题意:定义理想序列a[]:对于任意的i有a[i] = i.给出一个1到n的排列p[],可以将排列中的任意两个元素两两交换,定义f(p)为将p变为理想排列的最少交换次数,求将p变成排列q,使得f(q) = m 的最少交换次数和交换方案. tags:才知道置换群,看题解码的.. 使得一个排列有序的最小交换次数 = n - 置换群数目. 置换群,A->B,B->C,C->A,相当于一个轮换.   记住三点: 1.一个大小为L的置换群里面的元素至少且必能互换L-1

密码算法详解——AES

0 AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准. 根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128.AES-192和AES-256.本文主要对AES-128进行介绍,另外两种的思路基本一样,只是轮数会适当增加. 1 算法流程 AES加解密的流程图如下: AES加密过程涉及到4种操作:字节替代(SubBytes).行移位(ShiftRows).列混淆(MixCo

linux 本地账号密码无法登陆,一直返回 登陆的login界面

登陆redhat一直是返回login,账号和密码没错 通过ssh crt类的软件远程连接系统 然后更改文件   vi /etc/pam.d/login 把 :session required /lib/security/pam_limits.so 更改为:session required /lib64/security/pam_limits.so wq保存

凯撒密码、GDP格式化输出、99乘法表

1凯撒密码加密plaincode=input('请输入明文:')print('密文:',end='')for i in plaincode:print(chr(ord(i)+3),end='') 2.国家名称 GDP总量(人民币亿元) 中国 ¥765,873.4375澳大利亚 ¥ 78,312.4375 print('国家名称 GDP总量(人民币亿元)')print('{0:''<12}¥{1:''>10,.2f}'.format('中国',765873.4375))print('{0:''&

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

Mysql的更改密码

检查mysql的服务是否能开启,保证mysql的服务能正常开启,进行一下步骤 第一步:将你的Mysql解压到C盘根目录 第二步:(解压后进入目录,找到install.bat文件,用Ediplus打开,找到 --install mysql 和 net start mysql,两个mysql必须一样)进入cmd命令,没有配置环境变量的需要手动切换到mysql\bin的目录下cd命令进入 第三步:使用命令登陆mysql(mysql -localhost -u root),输入原始密码. 第四步: my

《linux破解root密码》

以下实验操作基于RHEL7.0下进行 步骤如下: 1. 重启系统 2. 按任意键,以中断启动加载器的倒计时. 3. 把光标移动到需要启动的条目. 4. 按e键,编辑该条目 把光标移动到linux16开头的行. 删除 console=ttys0,115200n8 在该行末尾,输入一个空格,然后添加  rd.break 注:rd.break表示控制权从initramfs转移到实际系统之前,进行中断. 5.  ctrl+x使用该改动并启动 启动好后,实际的根文件系统,以只读方式挂载到 /sysroot

3-1067. 试密码

1067. 试密码(20) 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过20的.不包含空格.Tab.回车的非空字符串)和一个正整数N(<= 10),分别是正确的密码和系统允许尝试的次数.随后每行给出一个以回车结束的非空字符串,是用户尝试输入的密码.输入保

Mysql忘记密码怎么办?

1.打开配置文件修改 shell>vi /etc/my.cnf 在[mysqld]下面加入 skip-grant-tables 然后按ESC键输入:wq回车 2.保存后重新启动MySQL shell>service mysqld restart 3.这样就可以无密码进入了,然后修改密码 如果出现这个问题 mysql>set password=password('123456aaa'); ERROR 1819 (HY000): Your password does not satisfy