T4样例输出2本地输出不了求助!!!

4. 最小循环节

题目ID:8624必做题100分

最新提交:

Runtime Error

0 分

历史最高:

Wrong Answer

60 分

时间限制: 1000ms

空间限制: 524288kB

题目描述

题目描述:

一个字符串 s 的循环节为 t,当且仅当 s 是由若干个 t 连接而成。例如 ab 就是 abababab 的循环节,同时 abab 也是 abababab 的循环节,但它们都不是 ababa 的循环节。

现给定 s,求 s 的长度最小的循环节。

输入格式:

第一行输入一个正整数 n。

第二行输入一个长度为 n 的字符串 s。

保证 s 仅有小写字母构成。

输出格式:

一行一个正整数,表示循环节长度的最小值。

样例输入:

10 ababcababc

样例输出:

5

数据规模:

1≤n≤106。
代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
string s;
string a[1000005]={""};
int cnt,pt;
int kmp(string s2,int m){
	cnt=0;
	pt=0;
	int ans[1000005]={0};
	ans[1]=0;
	for(int i=2;i<=m;i++){
		while(pt>0&&s2[i]!=s2[pt+1]){
			pt=ans[pt];
		}
		if(s2[i]==s2[pt+1]){
			pt++;
		}
		ans[i]=pt;
	}
	pt=0;
	for(int i=1;i<=n;i++){
		while(pt>0&&s[i]!=s2[pt+1]){
			pt=ans[pt];
		}
		if(s[i]==s2[pt+1]){
			pt++;
		}
		if(pt==m){
			//cout<<i-m+1<<endl;
			cnt++;
			pt=ans[pt];
		}
	}
	return cnt;
}

int main(){
	scanf("%d",&n);
	cin>>s;
	s=" "+s;
	for(int i=2;i<=n;i++){
		a[i]=a[i-1]+s[i];
	}
	for(int ans=1;ans<=n/2;ans++){
		if(n%ans){
			continue;
		}
		int zq=n%ans;
		if(zq==kmp(a[ans],ans)){
			cout<<ans;
			return 0;
		}
	}
	cout<<n;
	return 0;
}
/*

*/

把你错误代码发一下

一个式子,ans=n-kmp[n]。注意判断ans是不是n的因数

这不在求思路么,代码还没出生呢(不要管那个cin>>n;cout<<n;然后不可以总司令的60分

看我的帖子

OK 我看下哈

链接给下

1 个赞

啥连接?

你的啥帖子

1 个赞

上面我回你的

  1. 从长度 1 开始,到这个字符串长度的一半,一个一个的检查每个可能的循环节长度。
  2. 每个可能的循环节长度,检查重复该循环节长度的子串是否能够构成原始字符串。
  3. 若找到的第一个满足条件的长度就是最小循环节长度。
  4. 若没有找到,整个字符串就是最小循环节。

luogu搬运 , 思路基本一致, 但有点点不一样 , 上面有同学已经说了

我改了帖子,dalao们帮我康康

1 个赞

代码发出来

刷新啊牢弟,发代码了啊


这段别要