Hdu-1358Period(KMP算法之next数组的应用)
2024-10-15 10:25:21
题解:对于串pattern来说,如果0~i-1这个位置中循环,那么i%(i-next[i])==0 ,循环次数为 i/(i-next[i]),循环长度为 i-next[i]
例如对于串ababab来说
index 0 1 2 3 4 5
char a b a b a b
next -1 0 0 1 2 1
对于index=4时,i%(i-next[i])==0,而0~3位置的字符存循环。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
int N,next[];
char pattern[];//用于存放模式串 void getNext()//求next数组的模板
{
next[]=-;
int k=-,j=;
while(j<N){
if(k==-||pattern[k]==pattern[j]){
++j;++k;
next[j]=k;
}
else
k=next[k];
}
}
void solve()
{
//如果i%(i-next[i])==0 那么就有循环,循环次数为 i/(i-next[i]),循环长度为 i-next[i]
int i,n;
for(i=;pattern[i-];++i){
n=i-next[i];//这里我借鉴了一位大牛的博客,感谢大牛的博客
if(i%n== && i/n>){
printf("%d %d\n",i,i/n);
}
}
return;//记得得回溯
}
int main()
{
int cnt=;
while(~scanf("%d",&N),N){
getchar();
memset(next,,sizeof(next));
gets(pattern);
getNext();
printf("Test case #%d\n",++cnt);
solve();
printf("\n");
}
return ;
}
//关于solve()函数的详细解析请参考大牛的博客,http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html
最新文章
- 利用JS实现自定义滚动条
- mybatis自动生成代码
- Difference between Char.IsDigit() and Char.IsNumber() in C#
- 微信内置浏览器中,点击下拉框出现页面乱跳转现象(iphone)
- 使用ambari搭建Hadoop平台
- 通过Mouse Without Borders在多台机器上共享键盘鼠标
- Java对象的强、软、弱和虚引用详解
- Flask 应用最佳实践
- PDF文件优缺点
- Erdos
- 通过fiddler和逍遥模拟器模拟抓包android手机
- Java线程的5种状态及切换(透彻讲解)-京东面试
- 在vscode中,自定义代码片段,例vue组件的模板
- 图片按钮(imageButton)
- android.view.animation(1) - alpha、scale、translate、rotate、set的xml属性和用法(转)
- mvc框架详解
- jQuery样式与动画
- unity面试题二
- css3 兼容性
- LA 4670 AC自动机
热门文章
- POJ3304 Segments 【线段直线相交】
- NodeJs进击,新建一个Node Server
- centos6 python 安装 sqlite 解决 No module named ‘_sqlite3′
- Spring源码学习资料
- Attempting to badge the application icon but haven&#39;t received permission from the user to badge the application错误解决办法
- 【vim】查找重复的连续的单词
- Windows Server2008各版本区别
- 高级 Java 面试通关知识点整理!
- 006_netstat中state详解
- 关于nginx报错/usr/share/nginx/html/jiankongshare"; failed (2: No such file or directory)的问题解决