萌新沙东大汉初学字符串哈希零分求调
查看原帖
萌新沙东大汉初学字符串哈希零分求调
409774
Maysoul楼主2023/5/18 21:44

思路就是跟题解一样的哈希乘以反向哈希建立集合

#include<bits/stdc++.h>
typedef unsigned long long ull;
using namespace std;
const int MAXN=1e7+10;
int num,ans;
ull a[MAXN],b[MAXN];
ull base=11451;
ull jz[MAXN];
string s;
set<ull> jihe;
vector<int> vec;
int n;
void has()
{
	for (int i=1;i<=n;i++)
	{
		a[i]=a[i-1]*base+s[i];
	}
	for (int i=n;i>=1;i--)
	{
		b[i]=b[i+1]*base+s[i];
	}
}
int main()
{
	cin>>n;
	char c;
	s+=" ";
	for (int i=1;i<=n;i++)
	{
		cin>>c;
		s+=c;
	}
	jz[0]=1;
	for (int i=1;i<=10000000;i++)
	{
		jz[i]=jz[i-1]*base;
	}
	has();
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j+=i)
		{
			ull ss=a[j]-a[j-i]*jz[i];
			ull gg=b[j-i+1]-b[j+1]*jz[i];
			ull sg=ss*gg;
			jihe.insert(sg);
		}
		if(jihe.size()>ans)
		{
			ans=jihe.size();
			vec.clear();
			vec.push_back(i);
		}
		else if(jihe.size()==ans)
		{
			vec.push_back(i);
		}
		jihe.clear();
	}
	cout<<ans<<" "<<vec.size()<<endl;
	for (int i:vec)
	{
		cout<<i<<" "; 
	}
	return 0;
}

2023/5/18 21:44
加载中...