列表

详情


NC50313. Power Strings

描述

给定若干个长度的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的。如:ababab则最多有3个ab连接而成。

输入描述

输入若干行,每行有一个字符串。特别的,字符串可能为.即一个半角句号,此时输入结束。

输出描述

输出每个字符串最多是由多少个相同的子字符串重复连接而成的

示例1

输入:

abcd
aaaa
ababab
.

输出:

1
4
3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 115ms, 内存消耗: 5272K, 提交时间: 2022-09-24 10:08:36

#include <iostream>
#include <cstring>
using namespace std;
const int N=1e6+10;
int ne[N];
char c[N];
int main ()
{
	std::string a;
	while(std::cin>>c+1)
	{
		if(c[1]=='.'&&strlen(c+1))break;
		for(int i=2,j=0;c[i];i++)
		{
			while(j&&c[i]!=c[j+1])j=ne[j];
			if(c[j+1]==c[i])j++;
			ne[i]=j;
		}
		int cnt=0;
		int j=std::strlen(c+1);
		cnt=j/(j-ne[j]);
        if(j%(j-ne[j]))cnt=1;
		cout<<cnt<<endl;
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 61ms, 内存消耗: 12128K, 提交时间: 2019-08-14 23:07:15

#include<bits/stdc++.h>
using namespace std;
char a[1000005];
int p[1000005],n;
void pre()
{
	p[1]=0;
	int j=0;
	for(int i=1;i<n;i++)
	{
		while(j>0&&a[j+1]!=a[i+1])j=p[j];
		if(a[j+1]==a[i+1])j++;
		p[i+1]=j;
	}
}
int main()
{
	for(;;)
	{
		scanf("%s",a+1);
		if(a[1]=='.')break;
		n=strlen(a+1);
		pre();
		if(n%(n-p[n])==0)printf("%d\n",n/(n-p[n]));
		else printf("1\n");
	}
	return 0;
}

上一题