博客
关于我
HDU1358KMP求循环节
阅读量:137 次
发布时间:2019-02-28

本文共 1298 字,大约阅读时间需要 4 分钟。

直接说结论吧,KMP算法的前提是预处理一个next数组 ,一个字符串长度为len,那么这个字符串的最小循环节就是len-nxt[len]

因此有:

  1. 判断一个字符串是否完全循环可以用 (len%(len-nxt[len]))==0,并且nxt[len]!=0
  2. 该题中询问的是在末尾补上几个字符串可以使字符串完全循环,那么就用最小循环节(len-nxt[len])- 最末尾多余的字符个数(nxt[len]%最小循环节)即可

AC代码:

/* * @Author: hesorchen * @Date: 2020-07-03 17:05:01 * @LastEditTime: 2020-07-12 17:06:22 * @Description: https://hesorchen.github.io/ */#include 
using namespace std;#define IOS \ ios::sync_with_stdio(false); \ cin.tie(0); \ cout.tie(0);#define FRE \ { \ freopen("in.txt", "r", stdin); \ freopen("out.txt", "w", stdout); \ }#define ll long longll nxt[100010];char a[100010];void get_nxt(){ ll len = strlen(a); ll j = 0, k = -1; nxt[0] = -1; while (j < len) { if (k == -1 || a[j] == a[k]) nxt[++j] = ++k; else k = nxt[k]; }}int main(){ IOS; ll t; cin >> t; while (t--) { cin >> a; get_nxt(); if (strlen(a) % (strlen(a) - nxt[strlen(a)]) == 0 && nxt[strlen(a)] != 0) cout << 0 << endl; else cout << strlen(a) - nxt[strlen(a)] - (nxt[strlen(a)] % (strlen(a) - nxt[strlen(a)])) << endl; } return 0;}

参考资料

转载地址:http://sgod.baihongyu.com/

你可能感兴趣的文章
MySQL中B+Tree索引原理
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>