今天本来是后缀数组和平衡树考试的,昨天做了一天的平衡树
结果就只考了一个没学过的后缀平衡树(2333);
今天学没学过后缀数组并没有什么意义,大部分都可以用哈希做。
不得不说哈希真的是解决字符串问题的利器。。。
具体哈希的实现如下。。。自己模拟即可。。。
预处理:
1 pre[0]=1;for(int i=1;i<=100050;i++) pre[i]=pre[i-1]*29; 2 len=strlen(a+1); 3 for(int i=1;i<=len;i++) hsh[i]=hsh[i-1]*29+a[i]-'a'+1;
提取其中任意一段:
1 ll cal(int l,int r) 2 { 3 return hsh[r]-hsh[l-1]*pre[r-l+1]; 4 }
T1.加一个最优性剪枝,n^3变成萎O(n)--O(n^2);
就是这样:
1 for(int i=1;i<=len;i++) 2 { 3 for(int j=1;j<=len-i+1;j++) 4 { 5 if((len-i+1)/j>ans) ans=max(ans,work(i,j)); 6 else break; 7 } 8 }
T2完全不会。。。但并没有去打暴力,其实暴力2^n是有分的,错误的太小看暴力了。。。%%%cjk自己YY。。。
现在这题只是模模糊糊的懂一点。。。
T3 考虑到只在字符串的最后有添加和删除操作,所以对前面都没有影响。
那么直接把他加进来的贡献O(N)的算即可,我怕桶判段哈希有冲突就直接上了map,复杂度变成标准n^2*logn;60分
1 for(int i=1;i<=n;i++) 2 { 3 if(b[i]=='-') 4 { 5 for(int j=1;j<=tot;j++) 6 { 7 int v=cal(j,tot);vis[v]--; 8 if(vis[v]==0) ans--; 9 } 10 tot--; 11 } 12 else 13 { 14 a[++tot]=b[i],hsh[tot]=hsh[tot-1]*29+b[i]-'a'+1; 15 for(int j=1;j<=tot;j++) 16 { 17 int v=cal(j,tot);vis[v]++; 18 if(vis[v]==1) ans++; 19 } 20 } 21 printf("%lld ",ans); 22 }
这次考试并不代表水平,因为乱搞就有很高的部分分。。。。
以后要多练习自己打非完美算法的能力,毕竟省选题能AC的是极少数。。。
这周的码量真的大,几乎是平常的两到三倍,下周要多练点思维了。。。不然人都蠢了。。。