博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
loj10035. 「一本通 2.1 练习 1」Power Strings
阅读量:4595 次
发布时间: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

你可能感兴趣的文章
RHEL6下安装oracle 10g(一)
查看>>
Kconfig的格式
查看>>
关于Cursor的moveToFirst和moveToNext的意义
查看>>
个人--工资划分5份
查看>>
有关文件下载的文件名
查看>>
史上最详细的wamp配置虚拟域名步骤
查看>>
oracle 授权
查看>>
lv扩展磁盘空间
查看>>
java8之stream流的基本操作
查看>>
二维数组计算协方差java
查看>>
SpringBoot下Redis相关配置是如何被初始化的
查看>>
为你的AliOS Things应用增加自定义cli命令
查看>>
MongoDB 创建基础索引、组合索引、唯一索引以及优化
查看>>
百度PaddlePaddle常规赛NLP赛道火热开启
查看>>
稳了!这才是cookie,session与token的真正区别
查看>>
OSChina 周二乱弹 —— 假期余额已不足!
查看>>
前端那些事之React篇--helloword
查看>>
ios的google解析XML框架GDataXML的配置及使用
查看>>
netty-当一个客户端连接到来的时候发生了什么
查看>>
PHP_5.3.20 源码编译安装PHP-FPM
查看>>