萌新求调
  • 板块学术版
  • 楼主Hisy
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/18 10:06
  • 上次更新2024/8/18 10:16:02
查看原帖
萌新求调
922691
Hisy楼主2024/8/18 10:06

洛谷似乎没有,题面在这里。

#include<bits/stdc++.h>
#define MAXN 400004
#define HASH 31
#define map unordered_map
//#undef map
using namespace std;
typedef unsigned long long ull;
int m,len;
char s[MAXN];
ull base[MAXN],pre[MAXN];
inline ull get_hash(int l,int r){
	return pre[r]-pre[l-1]*base[r-l+1];
}
inline int check(int mid){
	map<ull,int> mp;
	int ans=-1;
	for(int i=1;i<=len-mid+1;++i){
		int hsh=get_hash(i,i+mid-1);
		++mp[hsh];
		if(mp[hsh]>=m){
			ans=i;
		}
	}
	return ans;
}
int main(){
    while(scanf("%d",&m)&&m){
        scanf("%s",s+1);
        len=strlen(s+1);
        base[0]=1;
        for(int i=1;i<=len;++i){
        	base[i]=base[i-1]*HASH;
        	pre[i]=pre[i-1]*HASH+s[i]-'a';
		}
        int l=1,r=len;
        pair<int,int> ans;
        if(check(1)==-1){
        	puts("none");
        	continue;
		}
        while(l<=r){
            int mid=(l+r+1)>>1;
            int x=check(mid);
            if(x!=-1){
            	l=mid+1;
				ans=make_pair(mid,x-1);
			}else{
				r=mid-1;
			}
        }
		printf("%d %d\n",ans.first,ans.second);
    }
    return 0;
}

时间复杂度应该没有问题,但是 T 了 Test2。

2024/8/18 10:06
加载中...