题目:http://poj.org/problem?id=3261
仍然是后缀数组的典型应用----后缀数组+lcp+二分
做的蛮顺的,1A
可是大部分时间是在调试代码。由于模板的全局变量用混了,而自己又忘了。,,等西安邀请赛还有四省赛结束之后,该冷静反思下尝试拜托模板了
错误 :1、k用错,题目的k和模板的k用混;
2、还是二分的C()函数,这个事实上跟前一篇《》的C函数写法差点儿相同。可是比那个简单,可是还是调了一会儿。,。開始的时候。没有记录ret,应该记录ret出现过的最大值
3、last>=kk-1才对,由于lcp[i]本身就是两个子串的公共前缀长度
int C(int x){ int ret=0,last=0; for(int i=0;i<=n;i++) { if(lcp[i]>=x)ret++; else { last=max(last,ret); ret=0; } } if(last>=kk-1)return 1; else return 0;}上代码:
#include#include #include #include using namespace std;const int MAXN = 20200;int rk[MAXN],sa[MAXN],s[MAXN],tmp[MAXN],lcp[MAXN],n,k,kk;bool cmpSa(int i,int j){ if(rk[i] != rk[j])return rk[i] 0)h--; for(; j+h =x)ret++; else { last=max(last,ret); ret=0; } } if(last>=kk-1)return 1; else return 0;}int main(){ //freopen("poj 3261.txt","r",stdin); while(scanf("%d%d",&n,&kk)!=EOF) { for(int i=0;i d+1) { mid=(d+up)/2; if(C(mid))d=mid; else up=mid; } printf("%d\n",d); } return 0;}