Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)
参考:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html
总结一下,如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且
循环节长度为: i - next[i]
循环次数为: i / ( i - next[i] )
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <string> 7 #include <algorithm> 8 #include <string> 9 #include <set> 10 #include <functional> 11 #include <numeric> 12 #include <sstream> 13 #include <stack> 14 #include <map> 15 #include <queue> 16 #pragma comment(linker, "/STACK:102400000,102400000") 17 #define CL(arr, val) memset(arr, val, sizeof(arr)) 18 19 #define ll long long 20 #define inf 0x7f7f7f7f 21 #define lc l,m,rt<<1 22 #define rc m + 1,r,rt<<1|1 23 #define pi acos(-1.0) 24 25 #define L(x) (x) << 1 26 #define R(x) (x) << 1 | 1 27 #define MID(l, r) (l + r) >> 1 28 #define Min(x, y) (x) < (y) ? (x) : (y) 29 #define Max(x, y) (x) < (y) ? (y) : (x) 30 #define E(x) (1 << (x)) 31 #define iabs(x) (x) < 0 ? -(x) : (x) 32 #define OUT(x) printf("%I64d\n", x) 33 #define lowbit(x) (x)&(-x) 34 #define Read() freopen("a.txt", "r", stdin) 35 #define Write() freopen("b.txt", "w", stdout); 36 #define maxn 1000000000 37 #define N 2510 38 #define mod 1000000000 39 using namespace std; 40 41 char a[1000010]; 42 int p[1000010]; 43 void next(int l) 44 { 45 int j=0; 46 p[1]=0; 47 for(int i=2;i<=l;i++) 48 { 49 while(j>0&&(a[j+1]!=a[i])) j=p[j]; 50 if(a[j+1]==a[i]) j+=1; 51 p[i]=j; 52 } 53 } 54 int main() 55 { 56 //freopen("a.txt","r",stdin); 57 int n,j=1; 58 while(~scanf("%d",&n)) 59 { 60 if(n==0) break; 61 printf("Test case #%d\n",j++); 62 scanf("%s",a+1); 63 int l=strlen(a+1); 64 next(l); 65 for(int i=1;i<=l;i++) 66 { 67 if(i%(i-p[i])==0&&p[i]!=0) 68 { 69 printf("%d %d\n",i,i/(i-p[i])); 70 } 71 } 72 printf("\n"); 73 } 74 return 0; 75 }
转载于:https://www.cnblogs.com/nowandforever/p/4601459.html
Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)相关推荐
- 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)
题干: CC always becomes very depressed at the end of this month, he has checked his credit card yester ...
- kmp求最小循环节及最小循环周期
只列出求最小循环节部分 for(int i=1;i<=n;i++){int temp=i-next[i];if(i%temp==0 && i/temp>1)printf(& ...
- UVALive 3026 Period (KMP算法简介)
kmp的代码很短,但是不太容易理解,还是先说明一下这个算法过程吧. 朴素的字符串匹配大家都懂,但是效率不高,原因在哪里? 匹配过程没有充分利用已经匹配好的模版的信息,比如说, i是文本串当前字符的下标 ...
- MUV LUV EXTRA -( kmp最小循环节 )
题目链接:点击进入 题意 一个无限循环小数( 从小数点后 某一位 开始依次不断地重复出现前一个或一节数字的十进制无限小数,叫做循环小数 ),真实价值 = a * p - b * l ( a , b 是 ...
- 【文文殿下】浅谈KMP算法next数组与循环节的关系
KMP算法 KMP算法是一种字符串匹配算法,他可以在O(n+m)的时间内求出一个模式串在另一个模式串下出现的次数. KMP算法是利用next数组进行自匹配,然后来进行匹配的. Next数组 Next数 ...
- 求字符串中字符的出现的最多次数和最少次数,删除后并获得最终字符
/* *功能描述:删除字符串中字符个数最少的字符,最少字符串有多个,最少的要全部删除 * 然后返回该子字符串. *输入:asdasdas *输出:asasas */ imp ...
- HDU - 1358 Period(KMP的next数组求最小循环节)
题目链接:点击查看 题目大意:给出一个长度为n的字符串,问有哪些前缀是周期性字符串 题目分析:因为n给的很大,所以肯定不能暴力判断了,我们可以巧妙的利用kmp的next数组进行判断,next数组有一个 ...
- 2019 CCPC秦皇岛 J 题 MUV LUV EXTRA【KMP 求最小循环节】
题意: 原题意是给出一个有理数的前一部分,求这个有理数的无限循环部分是什么.有一个值来评估猜的准确度.转换一下就成了下面的题意: 给出一个字符串s,有某一个子串,设p为该子串在s的某个后缀中的匹配长度 ...
- 字符串——OKR-Periods of Words(kmp求最短相同前后缀或者说求最长循环节)
传送门:OKR-Periods of Words 思路:题目要求的是最大的前缀Q使得A是QQ的前缀,同时Q不能等于A, 比如在bababab,要使得周期最大,应该选的循环节就是bababa, 另一个有 ...
最新文章
- mysql 回收空间_MySQL表的碎片整理和空间回收小结
- selenium IE 浏览器驱动下载地方
- 最大子段和问题——详解(C++)
- SQLite内部机制和新特性
- HTML前端代码分析(查看网站黑链的几种方法)暗链是什么意思
- fastjson list转json
- 物理层下面的传输媒体
- nRF51822 DTM 测试 不能连续发送数据
- linux强制安装deb,ubuntu强行修改deb安装包依赖
- 有什么值得入手的蓝牙耳机品牌?2022年蓝牙耳机品牌排行榜
- 中国口腔医疗行业发展模式与投资战略规划分析报告2022-2028年版
- MachineLearning(Hsuan-Tien Lin)第一讲
- 笔记本WIN10 网络和Internet WLAN选项消失
- ThoughtWorks公司——算法岗位作业题(计算机生成迷宫)
- word排版技巧:这几种特殊版式轻松搞定
- KeilIAR生成库及库的说明与使用
- linux 不装显卡驱动 3d性能,Nouveau Gallium3D开源驱动N卡性能测试
- 面试题:java GC是在什么时候,对什么东西,做了什么事情?
- 【Linux基础】Linux下查看硬件配置
- 微信支付-电商收付通业务概述