NOIP提高组模拟赛---好文章

NOIP 好文章

NOIP提高组模拟赛---好文章_第1张图片

题解

这道题呢看起来就貌似是一个纯的HASH,只需要枚举起点然后呢再来一个set自动去重,然后输出set的size就OK,理论上是这样的。不过呢鉴于各种各样的hash冲突,这道题哪怕是用双hash也只有七十分。原因就是大多数人喜欢用unsigned long long 就是对2^64取模,很容易被卡,而且10000007和10000009之类的常数也很容易被针对。所以就要另辟蹊径了

#include
using namespace std;
const int N=200200,P1=39916801,P2=9191891;
int n,m;
char st[N];
struct node{
    int x,y;
}c[N];
int h1[N],h2[N];
int p1[N],p2[N];
int hash1(int sta){
    int l=sta,r=sta+m-1;
    return(1ll*(h1[r]-h1[l-1]+P1)%P1*p1[n-r]%P1);
}
int hash2(int sta){
    int l=sta,r=sta+m-1;
    return(1ll*(h2[r]-h2[l-1]+P2)%P2*p2[n-r]%P2);
}
bool cmp(node a,node b){
    return (a.x

你可能感兴趣的:(提高组,NOIP,好文章,模拟赛)