Shift and Reverse
题目链接
题意:
一个序列a1,a2,a3…an
选择一个i,然后将序列改成ai,ai-1,…a1,an,an-1,…ai+1
可以进行无数次这样的操作
问:最多有多少不同的序列产生?(答案mod1e9+7)
题解:
如果我们把这个序列当做一个环,我们可以发现无论怎样操作其实都是这个环,只是在环的不同位置中断开
总共有2n中可能,用hash哈希判断是否一样即可
我们将原序列延长一倍
这样是为了方便后边的操作,这样我们就可以从左端1开始向后取n长度的序列,然后hash,存值,如果第一次出现就num++,
一遍操作过后,将整个序列翻转,再进行相同的操作
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e6+9;
ull hash1[maxn];
ull base[maxn];
int a[maxn];
map<ull,int>mp;
int n;
ull get_hash(int l,int r)
{return hash1[r]-hash1[l-1]*base[r-l+1];
}
void hashs()
{for(int i=1;i<=2*n;i++){hash1[i]=hash1[i-1]*131+(a[i]-'0');}
}
int main()
{base[0]=1;for(int i=1;i<=4e5+9;i++){base[i]=base[i-1]*131;}while(cin>>n){mp.clear();for(int i=1;i<=n;i++){cin>>a[i];a[n+i]=a[i];}hashs();ull sum=0;int num=0;for(int i=1;i<=n;i++){sum=get_hash(i,i+n-1);if(!mp[sum]){num++;}mp[sum]=1;}reverse(a+1,a+n*2+1);//翻转序列hashs();for(int i=1;i<=n;i++){sum=get_hash(i,i+n-1);if(!mp[sum]){num++;}mp[sum]=1;}printf("%d\n",num); }return 0;
}
Shift and Reverse相关推荐
- js数组、字符串常用方法和互相转换,==和===
2019独角兽企业重金招聘Python工程师标准>>> js基础的东西有很多还是不容忽视的,记录保存下来就可以时刻查看了(更深刻的理解). js脚本特点:基于对象.多范式.动态性. ...
- AJAX技术入门 第五节 Javascript高级知识
1.数组 Javascript中数组的大小是可以动态改变的 数组常用的方法: concat:合并数组,不会改变原数组,返回一个新的数组 join:将数组中的内容按照方法参数指定的字符连接成字符串并返回 ...
- perl基本语法--转载
http://www.cnblogs.com/zhtxwd/archive/2012/03/06/2381585.html 本文介绍从变量类型.操作运算符.控制叙述.子程序.I/O和档案处理. Reg ...
- vue 二维数组_最近研究Vue源码时我发现的一些好玩函数
来源 | segmentfault.com/u/chinamasters 作者 | chinamasters 最近在深入研究vue源码,把学习过程中,看到的一些好玩的的函数方法收集起来做分享,希望对大 ...
- 给array添加元素_前囧(06篇)Array 方法详解
属性 length 返回 或 设置 数组长度 创建数组 new Array | Array | [] // 方式1 三种情况Array() // []Array(2) // [empty *2]Arr ...
- 数据改动,更新视图,类似于vue
//当数据改变时,更新视图,和vue的有点类似let obj = { name:{ name:'ll' }, age:12,}let arr = [1,2,3];//针对数组的写法//当需要改变原型对 ...
- 2.Knockout.Js(监控属性Observables)
前言 1.创建一个ViewModel <script type="text/javascript">//1.创建一个ViewModelvar myViewModel = ...
- javascript实现汉诺塔动画效果
javascript实现汉诺塔动画效果 当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂 ...
- javascript --- vue2.x中原型的使用(拦截数组方法) 响应式原理(部分)
说明 在Vue2.x中,利用了对原型链的理解,巧妙的利用JavaScript中的原型链,实现了数组的pop.push.shift.unshift.reverse.sort.splice等的拦截. 你可 ...
最新文章
- Python网络编程(线程通信、GIL、服务器模型)
- 【批处理学习笔记】第二十四课:直接传递
- javabean反射改字段内容_BAT程序员编写:深入理解 Java 反射和动态代理源码分析...
- phpstudy php日志,phpstudy开启网站Apache日志并且按照日期划分创建
- 【UGV】32版UGV原理图
- 阮一峰网络日志 第41期 2019年01月25日
- 疫情当前,宅家学习不无聊,AI视频课程资源盘点
- 2021年中国电竞运动行业发展报告
- php mysql 字段自增_MySQL自增字段取值的详细介绍(附代码)
- 2020蓝桥杯省内模拟赛C++B组1-8(详细解析,看完就会)
- Java知识总结,不止为了秋招(下)!!!
- 三维扫描+逆向建模+3D打印复刻工艺品
- Unity插件 - MeshEditor(五) 网格顶点动画(变形动画)
- 下面哪些是python语言的特点_Python语言的特点有哪些?九大特点介绍!
- 搜索结果排列html模板,搜索结果页优化-城市模板
- 使用FCEUX调试器寻找并修改游戏初始物品
- Leaf-美团分布式ID生成服务
- 网易云音乐登录python
- 大恒相机标定with MATLAB
- uni-app实现仿微信前端(二)
热门文章
- 快速入门深度学习,其实并不难!
- 82 个代码案例实践,带你学好 Python 机器学习
- 分析函数在数据分析中的应用
- 《SAS编程与数据挖掘商业案例》学习笔记之十三
- oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)
- 小学学校计算机教室使用计划,小学电脑室工作计划
- php 电压 异常,tv断线警告是什么原因
- java换水_java-交流灌水之谁是水王?
- spring boot jar包_「Spring Boot 新特性」 jar 大小自动瘦身
- linux gcc出错,编译arm-linux-gcc出错