bzoj2258: pku2758 Checking the Text 文本校对 hash+二分
2017-11-05 21:52
369 查看
题意:给你一段文本 要求比对从文本中某两个位置开始能匹配的最大长度是多少。可以插入字符。
一开始不看范围感觉这题巨难,死刚SAM搞不出来,然后看看范围感觉自己被逗了。。
hash+二分,记录一下字符位置就好了,由于插入很少暴力更新hash数组即可。
自然溢出。
注意check的时候hash[r]-hash[l-1]*base^(r-l+1),这个地方的base是为了把前面的影响去掉,自己写一下就知道了。
一开始不看范围感觉这题巨难,死刚SAM搞不出来,然后看看范围感觉自己被逗了。。
hash+二分,记录一下字符位置就好了,由于插入很少暴力更新hash数组即可。
自然溢出。
注意check的时候hash[r]-hash[l-1]*base^(r-l+1),这个地方的base是为了把前面的影响去掉,自己写一下就知道了。
#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e5+5; char s ,s1[2],ch[2]; typedef unsigned long long ull; const int base=1789; ull hash ,bin ; int len,a ,num ,pos ; inline bool check(int x,int y,int n) { // printf("%d %d %d %d\n",x,y,n,len); if (x+n-1>len||y+n-1>len)return 0; ull s1=hash[x+n-1]-hash[x-1]*bin ; ull s2=hash[y+n-1]-hash[y-1]*bin ; return s1==s2; } int main() { scanf("%s",s+1); bin[0]=1; fo(i,1,50205)bin[i]=bin[i-1]*base; len=strlen(s+1); int sta=(s[1]>='a'&&s[1]<='z')?'a':'A'; fo(i,1,len) { a[i]=s[i]-sta+1; hash[i]=(hash[i-1]*base+a[i]); pos[i]=num[i]=i; } int q; scanf("%d",&q); while (q--) { scanf("%s",ch); if (ch[0]=='Q') { int x,y; scanf("%d%d",&x,&y); x=pos[x],y=pos[y]; int l=1,r=1e9,ans=0; while (l<=r) { int mid=(l+r)>>1; if (check(x,y,mid))ans=mid,l=mid+1; else r=mid-1; } printf("%d\n",ans); } else { int x; scanf("%s%d",s1,&x); if (x>len)a[++len]=s1[0]-sta+1; else { fd(i,len+1,x+1) a[i]=a[i-1],num[i]=num[i-1],pos[num[i]]++; a[x]=s1[0]-sta+1;++len;num[x]=0; } fo(i,x,len) hash[i]=(hash[i-1]*base+a[i]); } } }
相关文章推荐
- bzoj 2258: pku2758 Checking the Text 文本校对 hash+二分
- bzoj2258 pku2758 Checking the Text 文本校对(Hash+二分+splay)
- bzoj2258 pku2758 Checking the Text 文本校对
- BZOJ 2258 pku2758 Checking the Text 文本校对 Splay+Hash
- BZOJ 2258 pku2758 Checking the Text 文本校对 Splay+Hash+二分
- 【BZOJ】【P2258】【pku2758 Checking the Text 文本校对】【题解】【hash】
- poj 2758 && BZOJ 2258 Checking the Text 文本校对
- pku2758 Checking the Text
- poj 2758: Checking the Text(二分+Hash)
- POJ-2758 checking the text(哈希+二分)
- BZOJ2258 文本校对 (Splay Hash 二分答案)
- POJ 2758 Checking the Text
- poj2758 checking the text
- poj 2758 Checking the text
- POJ 2758 Checking the Text
- POJ 2758 Checking the text
- 【bzoj2258】【文本校对】【splay+hash】
- poj 2758 Checking the Text (后缀数组应用)
- POJ 2758 Checking the Text(Hash+二分答案)
- BZOJ1954 Pku3764 The xor-longest Path