会按梳理顺序放
my_std
- 打比赛的时候写完应该用
a+b
拍一下
#include<bits/stdc++.h>
using namespace std;
namespace my_std
{
typedef long long ll;
typedef unsigned long long ull;
#define fr(i,x,y) for(int i=(x);i<=(y);++i)
#define pfr(i,x,y) for(int i=(x);i>=(y);--i)
#define pc putchar
#define enter pc('
')
#define space pc(' ')
inline int read()
{
int f=1,sum=0;char ch=0;
while(!isdigit(ch)){if(ch=='-'){f=-1;}ch=getchar();}
while(isdigit(ch)){sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar();}
return sum*f;
}
inline void write(int x)
{
if(x<0){pc('-');x=-x;}
if(x>=10){write(x/10);}
putchar(x%10+'0');
}
inline void writeln(int x){write(x);enter;}
inline void writesp(int x){write(x);space;}
}
字符串
1. HASH
- 所有参与运算の变量应开
long long
orunsigned long long
- 有用的质数:(19260817,19660813,1145141,998244353,212370440130137957)(最后一个要用
ull
,考场上可以用 ( exttt{Miller-Rabin}) 找 (10^{18}) 的大质数) - 双模 HASH 不能像下面这样写:
ll n=read();
fr(i,1,n){scanf("%s",s);ans1[i]=hash1(s),ans2[i]=hash2(s);}
sort(ans1+1,ans1+n+1),sort(ans2+1,ans2+n+1);
ll tmp1=unique(ans1+1,ans1+n+1)-ans1-1,tmp2=unique(ans2+1,ans2+n+1)-ans2-1;
cout<<max(tmp1,tmp2)<<endl;
写出来的效果跟单模 HASH 是一样的
const ll N=10050,base=233,mod1=19260817,mod2=998244353;
char s[N];
struct qwq{ll a,b;}ans[N];
inline bool cmp(qwq a,qwq b){return a.a<b.a;}
inline ll hash1(char s[])
{
ll len=strlen(s),ans=0;
fr(i,0,len-1){ans=(ans*base+(ll)s[i])%mod1;}
return ans;
}
inline ll hash2(char s[])
{
ll len=strlen(s),ans=0;
fr(i,0,len-1){ans=(ans*base+(ll)s[i])%mod2;}
return ans;
}
int main(void)
{
ll n=read();
fr(i,1,n){scanf("%s",s);ans[i].a=hash1(s),ans[i].b=hash2(s);}
sort(ans+1,ans+n+1,cmp);
ll tmp=0;
fr(i,1,n) if(ans[i].a!=ans[i-1].a||ans[i].b!=ans[i-1].b) ++tmp;
writeln(tmp);
return 0;
}