首页 新闻 会员 周边 捐助

求大神看看为什么不能用typedef long long ll?

0
悬赏园豆:30 [已关闭问题] 关闭于 2017-07-09 21:19

代码有点长,但是出问题在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     
C++
沐灵_hh的主页 沐灵_hh | 初学一级 | 园豆:5
提问于:2017-07-09 21:00
< >
分享
所有回答(4)
0

非得用#define ll long long

吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-09 21:19
0

不需要吧、也可以不那么用吧

fcyh | 园豆:568 (小虾三级) | 2017-07-14 17:17
0

最好用# define ,#define是C语言中提供的宏定义命令,宏无脑替换的本质。typedef是编译阶段的一部分。它的意义是单一的。

沉沦的黑客 | 园豆:170 (初学一级) | 2017-08-21 16:46
0

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。

asahi86 | 园豆:242 (菜鸟二级) | 2017-08-29 07:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册