bzoj4598 [Sdoi2016]模式字符串 hash+点分

哈希也是有技巧的。不然很容易错。

匹配串范围是1e6的,所以普通hash错误概率也是很大的

所以就要利用匹配的特性(长度与匹配串一一对应)来hash,这样错误概率会小,相当于hash挂链吧。

一开始写的每个前缀hash存位置。这样一个hash里就有1e6个值。


码:

#include
#include
#include
#include
#include
#define P 2147483647
#define ll long long 
#define D(x) cout<v[N];
ll qian[N],hou[N];
int sz[N],fu[N],f[N],g[N],vf[N],vg[N],i,j,n,m,ans,tot,rt,now,T,a,b;
ll ci[N],lin;
char  ch[N],S[N];
bool vis[N];
void dfs(int o,int fa)
{
int i,nd;
    sz[o]=1;fu[o]=fa;
    for(i=0;i'Z')scanf("%c",&ch[i]);
        }
        for(i=1;i'Z')scanf("%c",&S[i]);
        }
lin=0;
for(i=0;i<=n;i++)
{
        lin=(lin*27+1ll*(S[(i%m)+1]-'A'+1))%P;
        qian[i]=lin;    
}
lin=0;
for(i=0;i<=n;i++)
{
        lin=(lin*27+1ll*(S[(m-i%m-1)+1]-'A'+1))%P;
        hou[i]=lin;
}       
        dfs(1,0);
        tot=n;
        zzx(1,0);   dfs(rt,0);
        work(rt);   printf("%d\n",ans); 
    }
}

你可能感兴趣的:(题目)