Poj 1961 KMP
2024-09-12 13:14:27
题意:给定一个字符串,求他每一个前缀,如果他是周期的,求len/最短循环节。
分析:
复习一下KMP,之前有详细解析。
由于朴素匹配每次移动一位,KMP可以多移动 f[i] 位,f 就是失配函数,失配函数怎么得到,是通过模式串自己匹配自己得到。
地推 f[i+1] ,如果 i+1 失配,那么先看前一个数字,他是否适合,不适合,继续向前。
本题:
应用 f,如果字符串周期,那么 他的最短循环节 可以通过 f 得到。
f[i] : 根据定义, 前缀 和后缀的最长公共长度,那么 i - f[i] 就是最短循环节。
需要注意的是,i+1,!!!(自己体会)
#include <cstdio>
#include <algorithm> using namespace std; const int maxn = + ;
char P[maxn];
int f[maxn]; int main()
{
int n,kase = ;
while(scanf("%d",&n),n) {
scanf("%s",P);
f[] = ;f[] = ;
for(int i=;i<n;i++) {
int j = f[i];
while(j&&P[i]!=P[j])
j = f[j];
f[i+] = (P[i] == P[j] ? j+:);
} printf("Test case #%d\n",kase++);
for(int i=;i<=n;i++) {
if(f[i]>&&i%(i-f[i])==)
printf("%d %d\n",i,i/(i-f[i]));
}
puts(""); }
return ;
}
最新文章
- JavaScript易错知识点整理
- ArrayIndexOutOfBoundsException
- Java笔记:修饰符
- CSS3参考手册
- Slow HTTP Denial of Service Attack
- javascript的关于刷新页面给出提示框的代码
- SCALA常规练习B
- banana pro 板子
- 使用EMOJI表情
- [转]java-Three Rules for Effective Exception Handling
- Eclipse用法和技巧十五:自动添加未实现方法1
- Java Concurrency (1)
- JavaScript中的DOM函数与关键字汇总
- Android OnLowMemory和OnTrimMemory
- bestcoder round 74 div2
- 使用whistle模拟cgi接口异常:错误码、502、慢网速、超时
- V8 下的垃圾回收机制
- SQLSERVER文件组误脱机后如何联机
- Day18 (二)反射
- NodeJS让前端与后端更友好的分手