zoukankan      html  css  js  c++  java
  • 51Nod

    我们定义2个字符串的相似度等于两个串的相同前缀的长度。例如 "abc" 同 "abd" 的相似度为2,"aaa" 同 "aaab" 的相似度为3。

    给出一个字符串S,计算S同他所有后缀的相似度之和。例如:S = "ababaa",所有后缀为:
     
    ababaa 6
    babaa 0
    abaa 3
    baa 0
    aa 1
    a 1
     
    S同所有后缀的相似度的和 = 6 + 0 + 3 + 0 + 1 + 1 = 11

    Input输入一个字符串S(1 <= L <= 1000000),L为字符串S的长度,且S由a-z的小写字母组成。Output输出S同所有后缀的相似度的和。Sample Input

    ababaa

    Sample Output

    11

     :  KMP可以求S串以i结尾的后缀与T串的前缀最长公共串长度。

     : 扩展KMP可以求S串以i为起点的的后缀与T串的前缀的最长公共字串。

       此题就是求所有i的扩展KMP长度;

    以前学过,已经忘得差不多了。这里再抄一发。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int N = 1001010;
    int next[N],extand[N];
    char S[N]; long long ans;
    void getnext(){
         int i,length=strlen(S+1);
         next[1]=length;
         for(i=0;i+1<length&&S[i+1]==S[i+2];i++);
         next[2]=i;
         int a=2;
         for(int k=3;k<=length;k++){
              int p=a+next[a]-1, L=next[k-a+1];
              if(L>=p-k+1){
                  int j=(p-k+1)>0?(p-k+1):0;
                  while(k+j<=length&&S[k+j]==S[j+1]) j++;
                  next[k]=j, a=k;
              } 
              else next[k]=L;
        } 
        for(int i=1;i<=length;i++) ans+=next[i];
        printf("%lld
    ",ans);
    }
    int main(){
        scanf("%s",S+1);
        getnext(); 
        return 0;
    }
  • 相关阅读:
    python中的编码问题
    CVPR2018 Tutorial 之 Visual Recognition and Beyond
    hdu 1376 Octal Fractions
    hdu 1329 Hanoi Tower Troubles Again!
    hdu 1309 Loansome Car Buyer
    hdu 1333 Smith Numbers
    hdu 1288 Hat's Tea
    hdu 1284 钱币兑换问题
    hdu 1275 两车追及或相遇问题
    hdu 1270 小希的数表
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9127146.html
Copyright © 2011-2022 走看看