代码:
#include<bits/stdc++.h>
#define MAXN 400004
#define HASH 31
#define map unordered_map
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
//#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;
}
死因:Time limit exceeded on test 2
死者作者的控诉:n log n 时间复杂度在 n<=40000 的情况下似乎不会 T