题意:有n个数值,算出相邻两个值的差值,此时有n-1个值的序列,把这序列当做字符串的话,求最长重复子串,且这两个子串不能重叠。
分析:后缀数组解决。先二分答案,把题目变成判定性问题:判断是否存在两个长度为k 的子串是相同的,且不重叠。
只能说后缀数组很强大
PS:刚好是男人八题之一..........8分之1男人了.......
#include#include #include #include using namespace std; #define N 22222 #define INF 0x7FFFFFFF /****后缀数组模版****/ #define F(x)((x)/3+((x)%3==1 0:tb)) //F(x)求出原字符串的suffix(x)在新的字符串中的起始位置 #define G(x)((x) =0; i--) b[--WS[wv[i]]]=a[i]; return; } //注意点:为了方便下面的递归处理,r数组和sa数组的大小都要是3*n void dc3(int *r,int *sa,int n,int m) { //rn数组保存的是递归处理的新字符串,san数组是新字符串的sa int i , j , *rn = r+n , *san = sa+n , ta = 0 ,tb = (n+1)/3 , tbc = 0 , p; r[n] = r[n+1] = 0; for(i=0; i = k) return true; } return false; } int main() { int n,t,tt; while(scanf("%d",&n) && n) { scanf("%d",&tt); -- n; for(int i=0; i > 1; if(judge(mid,n)) { ans = mid; l = mid + 1; } else { r = mid - 1; } } ans ++; if(ans >= 5) cout << ans << endl; else cout << 0 << endl; } return 0; } #include #include #include #include using namespace std; #define N 22222 #define INF 0x7FFFFFFF /****后缀数组模版****/ #define F(x)((x)/3+((x)%3==1 0:tb)) //F(x)求出原字符串的suffix(x)在新的字符串中的起始位置 #define G(x)((x) =0; i--) b[--WS[wv[i]]]=a[i]; return; } //注意点:为了方便下面的递归处理,r数组和sa数组的大小都要是3*n void dc3(int *r,int *sa,int n,int m) { //rn数组保存的是递归处理的新字符串,san数组是新字符串的sa int i , j , *rn = r+n , *san = sa+n , ta = 0 ,tb = (n+1)/3 , tbc = 0 , p; r[n] = r[n+1] = 0; for(i=0; i = k) return true; } return false; } int main() { int n,t,tt; while(scanf("%d",&n) && n) { scanf("%d",&tt); -- n; for(int i=0; i > 1; if(judge(mid,n)) { ans = mid; l = mid + 1; } else { r = mid - 1; } } ans ++; if(ans >= 5) cout << ans << endl; else cout << 0 << endl; } return 0; }