POJ 2406 Power Strings

本文介绍了一种利用KMP算法解决寻找字符串中重复不重叠子串的问题,并通过实例展示了如何实现这一过程。文中提供了完整的C++代码实现,帮助读者理解如何计算字符串的next数组并找出最长的重复循环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

POJ 2406

给定一个串,求其一个  重复不重叠子串  重复次数的最大值 (循环节了解一下)

就是对KMP匹配的理解

HUST - 1010类似

比较推荐这道HDU-3746

另外还有hdu3374 考察了循环节的同时,还有字符串的最大最小表示 大牛题解

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 const int maxn = 1e6 + 10;
 7 char pattern[maxn];
 8 int nxt[maxn];
 9 
10 void getnext() {
11     int n = strlen(pattern);
12     for (int i = 1; i < n; i++) {
13         int j = i;
14         while (j > 0) {
15             j = nxt[j];
16             if (pattern[j] == pattern[i]) {
17                 nxt[i + 1] = j + 1;
18                 break;
19             }
20         }
21     }
22 }
23 
24 int main(int argc, const char * argv[]) {
25     while (~scanf("%s", pattern)) {
26         if (pattern[0] == '.') break;
27         memset(nxt, 0, sizeof(nxt));
28         getnext();
29         int len = strlen(pattern);
30         if (len % (len - nxt[len]) == 0) {
31             printf("%d\n", len / (len - nxt[len]));
32         } else {
33             puts("1");
34         }
35     }
36     return 0;
37 }

 

转载于:https://www.cnblogs.com/xFANx/p/7277421.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值