zoukankan      html  css  js  c++  java
  • 最长公共子串

    /*
    最长公共子串
    用后缀自动机实现
    首先建立一个串的后缀自动机
    然后用另一个串在上面跑自动机即可
    
    */
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    #define M 500010
    using namespace std;
    char s[M];
    int ch[M][26], fa[M], len[M], lst = 1, cnt = 1;
    
    void insert(int c) {
        int f = lst, p = ++cnt;
        len[p] = len[f] + 1;
        lst = p;
        while(f && !ch[f][c]) ch[f][c] = p, f = fa[f];
        if(!f) fa[p] = 1;
        else
        {
            int q = ch[f][c];
            if(len[q] == len[f] + 1) fa[p] = q;
            else
            {
                int nq = ++cnt;
                len[nq] = len[f] + 1;
                fa[nq] = fa[q];
                fa[q] = fa[p] = nq;
                memcpy(ch[nq], ch[q], sizeof(ch[nq]));
                while(f && ch[f][c] == q) ch[f][c] = nq, f = fa[f];
            }
        }
    }
    
    int main() {
        scanf("%s", s);
        int l = strlen(s);
        for(int i = 0; i < l; i++) insert(s[i] - 'a');
        scanf("%s", s);
        l = strlen(s);
        int ans = 0;
        int now = 1, tmp = 0;
        for(int i = 0; i < l; i++) {
            int op = s[i] - 'a';
            if(ch[now][op]) {
                now = ch[now][op];
                tmp++;
            } else {
                while(now && !ch[now][op]) now = fa[now];
                if(now == 0) tmp = 0,now = 1;
                else tmp = len[now] + 1, now = ch[now][op];
            }
            ans = max(ans, tmp);
        }
        cout << ans << "
    ";
        return 0 ;
    }
  • 相关阅读:
    centos 配置静态ip
    mysql常用命令
    mac 安装好mysql后密码重置
    安装Intellij Idea14/15
    freemarker 学习一 入门小例子
    获取类路径
    mysql中的int smallint 取值范围
    MySQL按照汉字的拼音排序
    Log4j 基本配置
    追加写入
  • 原文地址:https://www.cnblogs.com/luoyibujue/p/9245555.html
Copyright © 2011-2022 走看看