首页 > 代码库 > [KMP]HDU1358 Period
[KMP]HDU1358 Period
题目链接
思考
题目就是利用KMP的失配数组来找循环串.具体看代码注释
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int nexta[1000002];char s[1000002];int n;//失配数组 void getnexta(){ memset(nexta,0,sizeof(nexta)); int k = -1,j = 0; nexta[0] = -1; while(j < n ) { if(k == -1 || s[k] == s[j]) { nexta[j + 1] = k + 1; j ++; k ++; } else { k = nexta[k]; } }}int main(){ int t = 0,temp; while(1) { t ++; scanf("%d",&n); if(n == 0) break; scanf("%s",s); printf("Test case #%d\n",t); getnexta(); for(int i = 1; i <= n; i ++) //从1开始循环的原因是 nexta[0]必然是0 { if(nexta[i] == 0) { continue; } else { //这里是主要 temp = i - nexta[i] ;//循环小节的长度 if( i % temp == 0 && i / temp > 1)//这是由于nexta[i]表示的是i-1 printf("%d %d\n",i ,i / temp); } } printf("\n"); } return 0;}
最后吐槽下我之前用KMP模板,之前的那个模板失配数组有毛病。
aaa这种串的失配数组是 0 0 1 大写的服!
[KMP]HDU1358 Period
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。