PKU 2274 Long Long Message( 后缀数组的应用)

     最长公共字串,给定两个串,其最长公共字串,后缀数组的简单应用。字符串的任意一个字串都是这个字符串的某个后缀的前缀。求A和B的最长公共字串定价于求A的后缀和B的后缀的最长公共前缀的最大值,所以可以将两个串连起来,中间用一个没出现过的字符隔开。这样就转换成了求最长可重叠重复字串的问题了,它就等于最大的Height值,因为任意两个后缀的最长公共前缀都是height数组中某一段中的最小值,那么这个值一定不大于height数组中的最大值。但这样还不行,如果你所求的两个串只在一个串中明显是不行的,所以还要加一个限制条件他们属于不同的串,只需suff[i-1]和suff[i]不同时在A或B中即可。

附部分代码:
bool Judge(int c)
{
      if(suff[c]>=len1&&suff[c-1]>=len1)
          return  false;
      else if(suff[c]<len1&&suff[c-1]<len1)
          return  false; 
      else
          return  true;                           
}                                           
int main()
{
        scanf("%s",str);
        len1=strlen(str);
        str[len1]=1;       //觉得中间不加字符,也应该是对的,但这样Runtime Error,还没想清楚
        scanf("%s",str+len1);
        len=strlen(str); 
        printf("%s %d",str,len);
        for(int i=0;i<len;i++)
           r[i]=str[i];
        CreatSuff(150);
        CalHeight();
        int Max=0;
        for(int i=1;i<len;i++)
          if(Max<H[i]&&Judge(i))
                 Max=H[i];
         printf("%d/n",Max);
         return 0;
}       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值