博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
loj10035. 「一本通 2.1 练习 1」Power Strings
阅读量:4586 次
发布时间:2019-06-09

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

思路:(以下为引用内容)

  

考虑整个串,根据next数组的定义,前后匹配并且前缀和相等的最长的后缀之间没有交叉,那么相等的部分的长度为next[n],并且从左往右相等。

 

如果希望中间的也是有s[1..next[n]]的几个循环组成,那么整个串就以next[n]为最小周期,但是如果这样,next[n]就会变大,与现在的情况矛盾。

 

那么n % (n-next[n])!=0,整个串为一个循环节,只有一个周期

#include
#include
#include
using namespace std;const int maxn = 1000010;int n, m;char A[maxn];char B[maxn];int nxt[maxn];int KMP() { int j = 0, cnt = 0; for(int i = 0; i < n; ++i) { if(A[i + 1] != B[j + 1]) return 0; if(A[i + 1] == B[j + 1]) j++; if(j == m) cnt++, j = 0; } return cnt;}void findnxt() { int j = 0; for(int i = 1; i < n; ++i) { while(j > 0 && A[i + 1] != A[j + 1]) j = nxt[j]; if(A[i + 1] == A[j + 1]) ++j; nxt[i + 1] = j; }}int main(void) { while(scanf("%s", A + 1) && A[1] != '.') { memset(nxt, 0, sizeof(nxt)); n = strlen(A + 1), m = 0; findnxt(); if(n % (n - nxt[n]) == 0) printf("%d\n", n / (n - nxt[n])); else printf("1\n"); }}

 

 LLnxt[L]

转载于:https://www.cnblogs.com/junk-yao-blog/p/9509673.html

你可能感兴趣的文章
《奇思妙想》人物篇--图灵奖得主概览
查看>>
Azure开发者任务之二:Cloud Service项目添加到ASP.Net Web中
查看>>
2017.2.28 activiti实战--第七章--Spring容器集成应用实例(五)普通表单
查看>>
读书笔记第一章
查看>>
Android 操作SQLite基本用法
查看>>
iis7 发布mvc3 遇到的HTTP错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容...
查看>>
(vue.js)element ui 表单验证 this$refs[formName]validate里面的内容死活不执行
查看>>
启动多个appium服务(同时运行多台设备)
查看>>
Java大数相乘-hdu1063
查看>>
mysql-mmm 部署高可用集群
查看>>
solaris启动过程详解 分类: arm-linux-Ubuntu ...
查看>>
while循环和递归
查看>>
Linux下yum安装Redis
查看>>
.Net 下未捕获异常的处理
查看>>
[机器学习]-Adaboost提升算法从原理到实践
查看>>
AOP概念
查看>>
memset函数详细用法说明【转】
查看>>
php解析xml字符串
查看>>
SFTP客户端与服务端
查看>>
Modbus协议
查看>>