《ybtoj高效进阶》第二部分第三章例题2 重复子串

题目大意

设一个字符串是由x个重复的子串构成的,求x的最大值
多组数据,以输入’.'为结束。

思路

显然一个自我KMP匹配,设该串为A,则若 ∣ A ∣ m o d    ( ∣ A ∣ − p ∣ A ∣ ) = 0 |A|\mod(|A|-p_{|A|})=0 Amod(ApA)=0,有重复子串,重复次数为 ∣ A ∣ ( ∣ A ∣ − p ∣ A ∣ ) |A| \over(|A|-p_{|A|}) (ApA)A,否则为1.
code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;
int p[1000006],n,m,ans=1;
string a,b;
inline void f()
{
    
    
	p[1]=0;
	int i=1,j=0;
	while (i<m)
	{
    
    
		while (j&&b[1+j]!=b[1+i]) j=p[j];
		if (b[1+j]==b[1+i]) j++;
		p[i+1]=j;
		i++;
	}
	if (m%(m-p[m])==0) ans=m/(m-p[m]);
	return;
}
int main()
{
    
    
	cin>>b;
	while (b!=".")
	{
    
    
		m=b.size();
		b.insert(0," ");
		f();
		cout<<ans<<endl;
		ans=1;
		cin>>b;
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_49843717/article/details/115212954
今日推荐