代码有点长,但是出问题在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
非得用#define ll long long
不需要吧、也可以不那么用吧
最好用# define ,#define是C语言中提供的宏定义命令,宏无脑替换的本质。typedef是编译阶段的一部分。它的意义是单一的。
long long 和 unsigned long long是不同的类型。
typedef long long ll; 其实只是给long long 这个类型取了一个别名而已,这个别名和unsigned long long没有任何的关系。
推荐做法应该是:
typedef long long ll;
typedef unsigned long long ull;
或者在c++ 11之后直接用 int64_t 和 uint64_t。