poj 1743 hash

来源:互联网 发布:windows pe修复系统 编辑:程序博客网 时间:2024/05/17 05:17

求差,不多说了

一开始的思路是先找到4个相同的串,找出最长串。

果断TLE

然后瞄了解题报告,用二分加速

http://www.mamicode.com/info-detail-252988.html

自己的代码存在许多小问题,修改到崩溃


#include<iostream>  #include<vector>#include <string>   #include<algorithm>  #include<fstream>#include<cmath>  using namespace std;  #define lch(i) ((i)<<1)  #define rch(i) ((i)<<1|1)  #define sqr(i) ((i)*(i))  #define pii pair<int,int>  #define mp make_pair  #define FOR(i,b,e) for(int i=b;i<=e;i++)  #define FORE(i,b,e) for(int i=b;i>=e;i--)  #define ms(a)   memset(a,0,sizeof(a))  const int maxnum =20010;const int key = 177;int tol,n,m,newn;unsigned long long hashn[maxnum];unsigned long long p[maxnum];//邻接表unsigned long long tag[maxnum];int nth[maxnum];int head[maxnum];int nextn[maxnum];int total;void Clear(){FOR(i,0,maxnum-1) head[i]=-1;total=0;}int inserthash(unsigned long long lentag,int pos){int x = lentag%maxnum;for(int i=head[x];i!=-1;i=nextn[i]){if(tag[i]==lentag) return nth[i];}nth[total]=pos;tag[total]=lentag;nextn[total]=head[x];head[x]=total++; return pos;}bool check(int len){Clear();FOR(i,len,n-1){if(i-inserthash((unsigned long long)hashn[i]-hashn[i-len]*p[len],i)>len)return true;}return false;}int src[maxnum],_src[maxnum];int main()    {    p[0]=1;FOR(i,1,maxnum-1){p[i]=p[i-1]*key;}//fstream fin("G:/1.txt");Pretreatment();while(scanf("%d",&n),n){//fin>>n;tol=0;FOR(i,1,n){//fin>>note[i];scanf("%d",&_src[i]);}FOR(i,1,n-1){src[i]=_src[i+1]-_src[i]+88;}hashn[0]=0;FOR(i,1,n-1){hashn[i] = hashn[i-1]*key+src[i];}int l=0,r=n,mid;while(l<=r){mid = (l+r)>>1;if(check(mid)){l=mid+1;tol = mid;}else r  = mid-1;}tol++;if(tol<5) tol=0;printf("%d\n",tol);}return 0;}  


0 0
原创粉丝点击