2017.03.04 考试总结

今天本来是后缀数组和平衡树考试的,昨天做了一天的平衡树

结果就只考了一个没学过的后缀平衡树(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\n",ans);
22     }

这次考试并不代表水平,因为乱搞就有很高的部分分。。。。

以后要多练习自己打非完美算法的能力,毕竟省选题能AC的是极少数。。。

这周的码量真的大,几乎是平常的两到三倍,下周要多练点思维了。。。不然人都蠢了。。。

posted @ 2017-03-06 09:06  qt666  阅读(193)  评论(0编辑  收藏  举报