POJ 2406 Power Strings(KMP OR 后缀数组,4级)

本文介绍了一种通过KMP算法解决字符串幂运算问题的方法。针对给定的字符串s,找到最大的整数n使得s可以表示为某个字符串a重复n次得到的结果。此问题通过预处理字符串s并使用KMP算法的next数组来高效解决。

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

I - Power Strings
Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
Appoint description: 

Description

Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

Input

Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

Output

For each s you should print the largest n such that s = a^n for some string a.

Sample Input

abcd
aaaa
ababab
.

Sample Output

1
4
3

Hint

This problem has huge input, use scanf instead of cin to avoid time limit exceed.

思路:KMP的next 指的是1-next[] 与 len-next[]-len是一样的。

#include<iostream>
#include<cstring>
#include<cstdio>
#define ll(x) (1<<x)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define clr(f,z) memset(f,z,sizeof(f))
using namespace std;
const int msize=1e6+9;
class KMP
{public:
 int next[msize],len;
 char s[msize];
 void getnext()
 { int j=0,k=-1;
   len=strlen(s);
   next[j]=-1;
  while(j<len)
  {
   if(k==-1||s[j]==s[k])
   {
    ++j;++k;
    next[j]=k;
   }
   else k=next[k];
  }
 }
 void getans()
 {int ans;
  getnext();
  if(len%(len-next[len])==0)
  ans=len/(len-next[len]);
  else ans=1;
  printf("%d\n",ans);
 }
};
KMP s;
int main()
{// freopen("data.in","r",stdin);
  while(~scanf("%s",s.s))
  {
   if(s.s[0]=='.')break;
   s.getans();
  }
}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值