【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

KMP算法可以把"i前缀"pre[i]
分成ssssst的形式
这里t是s的前缀。

然后s其实就是pre[i]中的前 i+1-f[i]个字符组成的

字符串。

特殊的,t可能就是一个空串。

比如abcdefg

这里f是kmp算法中的f数组

然后t有两种可能

① t==s

 这样的话,整个前缀就是

 sssssss..ss了

 这里有(i)/(i-f[i])个s

 设为num;

 我们可以用这些s来构造ababababa的形式。

 则我们需要k个ab 然后一个a

 我们可以用num/k个s来构成ab,然后num%k个s来

 构成一个a

 我们只需要判断一下num/k是否大于等于num%k就

 好了,因为ab是由num/k个s构成的,a是由num%k个s

 构成的,ab的长度肯定要大于等于a的长度的

 (a可以为空串,所以等于也可以)

 (因此num/k-num%k个s就是b了)

 用num/k个s来构成ab,可以让ab的长度尽量长一点

 然后a的长度也变成尽可能地短了。

 ->只有num%k

  这就让答案尽可能地正确了。

 贪心吧。

②t!=s

 这种情况其实也类似。

 这不过那个t只能算成是a中的了。

 因此num/k不能等于num%k了。

 只能num/k>num%k

 然后那个t加在num%k个s后面组成a

 这样a的长度才不会超过num/k.

我写的KMP中f[i]指的是如果i失配了下一个和谁尝试匹配,也就是说s[0..f[i]-1]=s[i-1-f[i]+1..i-1] 因此n-1的循环节要i循环到n才能知道。

【代码】

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N = 1e6;
  5. char s[N+10];
  6. int f[N+10],n,k;
  7. int main(){
  8. #ifdef LOCAL_DEFINE
  9. freopen("rush_in.txt", "r", stdin);
  10. #endif
  11. ios::sync_with_stdio(0),cin.tie(0);
  12. cin >> n >> k;
  13. cin >>s;
  14. f[0] = f[1] = 0;
  15. for (int i = 1;i <n;i++){
  16. int j = f[i];
  17. while (j>0 && s[i]!=s[j]){
  18. j = f[j];
  19. }
  20. f[i+1]=(s[i]==s[j]?(j+1):0);
  21. }
  22. for (int i = 1;i <= n;i++){
  23. //f[i] = x
  24. int num = i/(i-f[i]);
  25. int ab = num/k,a = num%k;
  26. if (i%(i-f[i])==0){
  27. if (ab>=a){
  28. cout<<1;
  29. }else {
  30. cout<<0;
  31. }
  32. }else{
  33. if (ab>a){
  34. cout<<1;
  35. }else{
  36. cout<<0;
  37. }
  38. }
  39. }
  40. return 0;
  41. }

【Henu ACM Round#16 F】Om Nom and Necklace的更多相关文章

  1. 【Henu ACM Round#19 E】 Om Nom and Candies

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 紫书上的原题: 链接 [代码] #include <bits/stdc++.h> #define ll long lon ...

  2. 【Henu ACM Round#17 F】Upgrading Array

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...

  3. 【Henu ACM Round #13 F】Fibonacci-ish

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举序列的头两个数字是什么 O(N^2) 然后头两个数字确定之后. f[3],f[4]..就确定了 只需查看f[3],f[4]..是 ...

  4. 【Henu ACM Round#15 F】Arthur and Questions

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...

  5. 【Henu ACM Round#16 E】Paths and Trees

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 感觉很像一道最短路. 然后就试了一发. 结果真的是.. 只要用一个优先队列优化的dijkstra算法求出每个点的最短路上的前一个点是 ...

  6. 【Henu ACM Round#18 F】Arthur and Walls

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...

  7. 【Henu ACM Round#20 F】 Arthur and Brackets

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...

  8. 【Henu ACM Round#19 F】Dispute

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这一题和这一题很像 (链接 ) 会发现如果a[i]!=b[i]那么就按下i就好了. 然后改变和他相邻的点. 此后a[i]再也不可能和 ...

  9. 【Henu ACM Round#16 D】Bear and Two Paths

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先搞一条a到b的路径 a c x3 x4 x5....xn-2 d b 然后第二个人的路径可以这样 c a x3 x4 x5...x ...

随机推荐

  1. PostgreSQL 数据库性能调优的注意点

    PostgreSQL提供了一些性能调优的功能.主要有如下几个方面.1.使用EXPLAIN   EXPLAIN命令可以查看执行计划,这个方法是我们最主要的调试工具. 2.及时更新执行计划中使用的统计信息 ...

  2. pic减法进位问题

    1.pic指令中subwf是 F - Wreg,且如果F>=Wreg,则C=1:如果F<Wreg,则C=0:这是由于pic的减法是加上减数的补码实现的.例如3-2,其实是3+FE=01,进 ...

  3. 初识Git(一)

    以前经常听到Git,作为一个菜鸟级自学选手从没有真正去了解Git,借刘铁猛老师在油管上的<对答如刘>初步认识了git,作以下记录. 1.初始化一个git管理的文件夹 首先我在我的电脑C盘P ...

  4. 给DOM操作生成的元素添加事件

    问题:通过js给页面添加新元素,并给该元素添加绑定事件,但新添加的元素上却没有绑定任何事件. 常见例子:在处理表格的时候,每行行末有个删除按钮,如下图.点击删除按钮的时候删除这一行. //html部分 ...

  5. MySQL常用技能篇

    写在之前的话: 之前一直在用MSSERVER,刚用MySQL时有很多的不适应.就此小结一下工作中遇到的问题和场景(用的不是很深入,供初学者参考),文中出现的局限性欢迎指出 MySQL有客户端式(SQL ...

  6. Maven命令下载源码和javadocs

    1:Maven命令下载源码和javadocs 当在IDE中使用Maven时如果想要看引用的jar包中类的源码和javadoc需要通过maven命令下载这些源码,然后再进行引入,通过mvn命令能够容易的 ...

  7. Mean, Median, Mode, Range, and Standard Deviation

    Descriptive statistics tell you about the distribution of data points in data set. The most common m ...

  8. Keepalived原理及VRRP协议与应用配置(详细)

    转载自:https://blog.csdn.net/u010391029/article/details/48311699 1. 前言 VRRP(Virtual Router Redundancy P ...

  9. sed 替换 引用变量值,记录一个自己学习错误的地方。

    先上脚本,脚本的目的是虚拟机克隆-连接克隆,然后修改ip这个搞定,修改hostname就很简单了 declare oldipdeclare -i Anamedeclare newipoldip=`ca ...

  10. linux 空间不够了 修改 /boot

    1>  查看空间多少:df -h2>  查看当期内核: uname -r3>  查找内核   rpm -qa | grep kernel4>  删除多余的内核 yum remo ...