设为首页 加入收藏

TOP

POJ 1743 Musical Theme(后缀数组)
2014-11-23 19:18:58 来源: 作者: 【 】 浏览:5
Tags:POJ 1743 Musical Theme 后缀

题意:有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;
}

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 2114 Boatherds[Tree,点分治] 下一篇HDU4638[离线树状数组]

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·求navicat for mysql (2025-12-26 13:21:33)
·有哪位大哥推荐一下m (2025-12-26 13:21:30)
·MySQL下载与安装教程 (2025-12-26 13:21:26)
·Linux_百度百科 (2025-12-26 12:51:52)
·Shell 流程控制 | 菜 (2025-12-26 12:51:49)