• 「水」悠悠碧波 kmp


    链接:https://ac.nowcoder.com/acm/contest/6226/E
    来源:牛客网

    题目描述

    帕秋莉掌握了一种水属性魔法

    这种魔法可以净化黑暗

    帕秋莉发现对于一个黑暗的咒语s,可以使用这个水元素魔法净化它,净化的咒语是一个最长的字符串t,t满足以下条件:

    它是s的前缀

    它是s的后缀

    除前缀和后缀外,它还在s中出现过至少一次

    既然你都学会了,那么净化的工作就交给你了!

    输入描述:

    一行字符串 s ,代表黑暗咒语

    输出描述:

    一个字符串 t ,表示满足条件的最长净化咒语

    示例1

    输入

    tqrwantoacthisproblembutqristooweaktodoitqr

    输出

    tqr

    题解

    标准的kmp, 一看前后相同, 就是kmp的 f[fen]了

    问题就是让其在字符串中出现, 因为答案必定存在

    所以就是把除了 f[len]的其他长度的重复串标记一下就行了

    代码

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=a;i<=(b);++i)
    #define per(i,a,b) for(int i=a;i>=(b);--i)
    #define IO ios::sync_with_stdio(0);cin.tie(0)
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> PII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
     
    const int N = 1e5 + 5;
     
    int n, m, _, k;
    char s[N];
    int f[N], len;
    bool v[N];
     
    void KMP(char *s) {
        f[1] = 0;
        for (int i = 2, j = 0; s[i]; ++i) {
            while (j > 0 && s[i] != s[j + 1]) j = f[j];
            if (s[j + 1] == s[i]) ++j;
            f[i] = j; 
            if (i != len) v[f[i]] = 1;
        }
    }
     
    int main() {
        ios::sync_with_stdio(0);cin.tie(0);
        cin >> s + 1;
        len = strlen(s + 1);
        KMP(s);
    
        int ans = f[len];
        while (true) {
            if (v[ans]) break;
            ans = f[ans];
        }
        
        rep (i, 1, ans) cout << s[i];
        return 0;
    }
    
  • 相关阅读:
    shell 中"${b2}" and "${b:2}"
    关于 libpcap的安装
    ubuntu adsl 上网
    2011.1.18 运算符优先级
    Tail Queues
    fd_set struct
    读取和修改操作array 配置文件的方法
    smarty调试方法
    一个CURL例子
    cakephp数据库事务transactions
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/13264068.html
Copyright © 2020-2023  润新知