题目链接

题意:

一个序列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相关推荐

  1. js数组、字符串常用方法和互相转换,==和===

    2019独角兽企业重金招聘Python工程师标准>>> js基础的东西有很多还是不容忽视的,记录保存下来就可以时刻查看了(更深刻的理解). js脚本特点:基于对象.多范式.动态性. ...

  2. AJAX技术入门 第五节 Javascript高级知识

    1.数组 Javascript中数组的大小是可以动态改变的 数组常用的方法: concat:合并数组,不会改变原数组,返回一个新的数组 join:将数组中的内容按照方法参数指定的字符连接成字符串并返回 ...

  3. perl基本语法--转载

    http://www.cnblogs.com/zhtxwd/archive/2012/03/06/2381585.html 本文介绍从变量类型.操作运算符.控制叙述.子程序.I/O和档案处理. Reg ...

  4. vue 二维数组_最近研究Vue源码时我发现的一些好玩函数

    来源 | segmentfault.com/u/chinamasters 作者 | chinamasters 最近在深入研究vue源码,把学习过程中,看到的一些好玩的的函数方法收集起来做分享,希望对大 ...

  5. 给array添加元素_前囧(06篇)Array 方法详解

    属性 length 返回 或 设置 数组长度 创建数组 new Array | Array | [] // 方式1 三种情况Array() // []Array(2) // [empty *2]Arr ...

  6. 数据改动,更新视图,类似于vue

    //当数据改变时,更新视图,和vue的有点类似let obj = { name:{ name:'ll' }, age:12,}let arr = [1,2,3];//针对数组的写法//当需要改变原型对 ...

  7. 2.Knockout.Js(监控属性Observables)

    前言 1.创建一个ViewModel <script type="text/javascript">//1.创建一个ViewModelvar myViewModel = ...

  8. javascript实现汉诺塔动画效果

    javascript实现汉诺塔动画效果 当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂 ...

  9. javascript --- vue2.x中原型的使用(拦截数组方法) 响应式原理(部分)

    说明 在Vue2.x中,利用了对原型链的理解,巧妙的利用JavaScript中的原型链,实现了数组的pop.push.shift.unshift.reverse.sort.splice等的拦截. 你可 ...

最新文章

  1. Python网络编程(线程通信、GIL、服务器模型)
  2. 【批处理学习笔记】第二十四课:直接传递
  3. javabean反射改字段内容_BAT程序员编写:深入理解 Java 反射和动态代理源码分析...
  4. phpstudy php日志,phpstudy开启网站Apache日志并且按照日期划分创建
  5. 【UGV】32版UGV原理图
  6. 阮一峰网络日志 第41期 2019年01月25日
  7. 疫情当前,宅家学习不无聊,AI视频课程资源盘点
  8. 2021年中国电竞运动行业发展报告
  9. php mysql 字段自增_MySQL自增字段取值的详细介绍(附代码)
  10. 2020蓝桥杯省内模拟赛C++B组1-8(详细解析,看完就会)
  11. Java知识总结,不止为了秋招(下)!!!
  12. 三维扫描+逆向建模+3D打印复刻工艺品
  13. Unity插件 - MeshEditor(五) 网格顶点动画(变形动画)
  14. 下面哪些是python语言的特点_Python语言的特点有哪些?九大特点介绍!
  15. 搜索结果排列html模板,搜索结果页优化-城市模板
  16. 使用FCEUX调试器寻找并修改游戏初始物品
  17. Leaf-美团分布式ID生成服务
  18. 网易云音乐登录python
  19. 大恒相机标定with MATLAB
  20. uni-app实现仿微信前端(二)

热门文章

  1. 快速入门深度学习,其实并不难!
  2. 82 个代码案例实践,带你学好 Python 机器学习
  3. 分析函数在数据分析中的应用
  4. 《SAS编程与数据挖掘商业案例》学习笔记之十三
  5. oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)
  6. 小学学校计算机教室使用计划,小学电脑室工作计划
  7. php 电压 异常,tv断线警告是什么原因
  8. java换水_java-交流灌水之谁是水王?
  9. spring boot jar包_「Spring Boot 新特性」 jar 大小自动瘦身
  10. linux gcc出错,编译arm-linux-gcc出错