代码有点长,但是出问题在typedef long long ll;(第11行),我想知道为什不不能用typedef long long ll;难道非得用#define ll long long吗?
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<ext/pb_ds/assoc_container.hpp>
6 #include<ext/pb_ds/hash_policy.hpp>
7 using namespace __gnu_pbds;
8 using namespace std;
9 const int maxn=200000+5;
10 const int B=200191;
11 typedef long long ll;
12 int read()
13 {
14 int x=0,f=1;char ch=getchar();
15 while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
16 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
17 return x*f;
18 }
19 unsigned long long mul[maxn],s1[maxn],s2[maxn];
20 int n,mx,num;
21 int a[maxn],b[maxn];
22 gp_hash_table<unsigned ll,bool>mp;
23 unsigned ll gethash(int l,int r)
24 {
25 unsigned ll t;
26 if(l<=r) t=s1[r]-s1[l-1]*mul[r-l+1];
27 else
28 t=s2[r]-s2[l+1]*mul[l-r+1];
29 return t;
30 }
31 void solve(int x)
32 {
33 if(mx*x>n) return;
34 int ans=0;
35 mp.clear();
36 for(int i=1;i<=n;i+=x)
37 if(i+x-1<=n)
38 {
39 unsigned ll t=gethash(i,i+x-1)*gethash(i+x-1,i);
40 if(mp[t]) continue;
41 else ans++;
42 mp[t]=1;
43 }
44 if(ans>mx) mx=ans,num=0;
45 if(ans==mx) b[++num]=x;
46 }
47 int main()
48 {
49 n=read();
50 for(int i=1;i<=n;i++) a[i]=read();
51 mul[0]=1;
52 for(int i=1;i<=n;i++) mul[i]=mul[i-1]*B;
53 for(int i=1;i<=n;i++)
54 s1[i]=s1[i-1]*B+a[i];
55 for(int i=n;i>=1;i--)
56 s2[i]=s2[i+1]*B+a[i];
57 for(int i=1;i<=n;i++) solve(i);
58 printf("%d %d\n",mx,num);
59 for(int i=1;i<=num;i++)
60 {
61 printf("%d",b[i]);
62 if(i!=num) printf(" ");
63 }
64 return 0;
65 }
66来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/818/viewspace-3171080/ ,如需转载,请注明出处,否则将追究法律责任。