Description

nodgd写了一篇文章,自认为这是一篇好文章。nodgd的文章由n个小写英文字母组成。文章的一个子串指的是文章中的一段连续的字母,子串的长度就是这一段的字母个数。nodgd在文章中用了排比、对偶、前后照应之类的手法,所以就有很多个子串是相同或者相近的。为了向大家证明这是一篇好文章,nodgd决定给自己的文章进行评分。nodgd首先确定了一个整数m,然后统计出文章中有多少个不相同的长度为m的子串,这个数量就是文章的评分。
然而,nodgd懒得老老实实计算这个评分了,就把任务丢给了你。

Input

第一行包含两个整数n,m,表示文章的长度和需要统计的子串长度。
第二行包含一个长度为n的只包含小写字母的字符串。

Output

输出一行一个整数,表示文章的评分。

Sample Input

输入1:
5 3
aaaab

输入2:
9 3
abcabacba

Sample Output

输出1:
2
样例解释1:
长度为3的子串有3个,分别是aaa,aaa,aab,其中不同的只有2个。
输出2:
7
样例解释2
共有7个长度为3的子串,每个长度为3的子串都不同。

Data Constraint

对于30%的数据,1≤m≤n≤200;
对于50%的数据,1≤m≤n≤2000;
对于另外20%的数据,1≤m≤50≤n≤200000;
对于100%的数据,1≤m≤n≤200000。

题解

字符串判断是否重复,
哈希判重。
将字符串转化成为一个数,
然后就可以了。
但是要用多几个质数,否则容易出错。

code

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define N 200003
#define ll long long
#define M1 2333333
#define M2 998244353
using namespace std;
char ch;
void read(int& n)
{n=0;for(ch=getchar();ch<'0'||ch>'9';ch=getchar());for(;'0'<=ch && ch<='9';n=(n<<3)+(n<<1)+ch-48,ch=getchar());
}void G(char &ch)
{for(ch=getchar();ch<'a'||ch>'z';ch=getchar());
}int n,m,ans;
ll z1[N],z2[N],p[N],s1,s2,h[M1][2];bool ins()
{int x=s1%M1;while((h[x][0]!=0 || h[x][1]!=0)&&(h[x][0]!=s1 || h[x][1]!=s2))x=(x+1)%M1;if(h[x][0]==s1 && h[x][1]==s2)return 0;h[x][0]=s1;h[x][1]=s2;return 1;
}int main()
{freopen("article.in","r",stdin);freopen("article.out","w",stdout);read(n);read(m);z1[0]=z2[0]=1;for(int i=1;i<=m;i++)z1[i]=z1[i-1]*m%M1,z2[i]=z2[i-1]*m%M2,G(ch),p[i]=ch-48;s1=s2=0;for(int i=1;i<=m;i++)s1=(z1[m-i]*p[i]+s1)%M1,s2=(z2[m-i]*p[i]+s2)%M2;ans=1;ins();for(int i=m+1;i<=n;i++){G(ch),p[i]=ch-48;s1=(s1-z1[m-1]*p[i-m]%M1+M1)%M1;s2=(s2-z2[m-1]*p[i-m]%M2+M2)%M2;s1=(s1*m+p[i])%M1;s2=(s2*m+p[i])%M2;if(ins())ans++;}printf("%d\n",ans);return 0;
}

JZOJ5462. 【NOIP2017提高A组冲刺11.8】好文章相关推荐

  1. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列

    Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...

  2. jzoj_5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  3. [JZOJ5459]【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

  4. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数

    Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...

  5. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  6. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  7. JZOJ5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  8. JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏

    Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...

  9. JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章

    Description nodgd写了一篇文章,自认为这是一篇好文章.nodgd的文章由n个小写英文字母组成.文章的一个子串指的是文章中的一段连续的字母,子串的长度就是这一段的字母个数.nodgd在文 ...

最新文章

  1. 【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图设置自适应屏幕...
  2. 爆肝,52条SQL语句,性能优化,干货必收藏 !
  3. 圈子 | 苏宁易购产品经理:平台支撑型产品的思维方式
  4. 20190101.DDD笔记
  5. Algs4-1.5.1使用quick-find算法处理序列
  6. jquery点击缩略图切换视频播放的视频切换焦点图效果
  7. C++实现两个矩阵相乘
  8. P3112-[USACO14DEC]后卫马克Guard Mark【贪心】
  9. 怎么停止skywalking_Skywalking部署常见问题以及注意事项
  10. Vue+Element!一千字带你编写合理的编辑,查看,新建!
  11. CMake常用命令整理
  12. Matlab重建信号实验总结,实验三信号采样与重建(实验报告).doc
  13. 不学点《近世代数》怎么学好现代密码学
  14. 110部值得一看的电影
  15. Hash表的初步认识
  16. CSV文件格式——方便好用个头最小的数据传递方式
  17. 机器学习项目一:共享单车
  18. Java编程思想(六)
  19. WMB数据源配置与绑定
  20. The file contains a character that cannot be represented in the current code page.c1070

热门文章

  1. 《码出高效》五 异常与日志
  2. java.security Cipher 对象详细介绍
  3. prism 加载模块的四种方法
  4. 海绵蛋糕——来至于完美戚风的化身
  5. 2006-07-16蜡肉的吃法(不完全)
  6. 【ios开发技术研究】Xcode8 及iOS10适配问题整理汇总
  7. top命令详解(转载学习)
  8. html与网页设计 实践课,HTML5网页设计课程混合式教学设计与实践
  9. 经典答案:下水道井盖为什么是圆的——让面试官无语
  10. 旅行家问题2(TSP,奇怪的转化模型)