zoukankan      html  css  js  c++  java
  • Codeforces Beta Round #93 (Div. 1 Only) B. Password KMP

    链接:

    http://codeforces.com/contest/126/problem/B

    题意:

    给你一个字符串,问是否存在一个子串出现在开头结尾和中间,找出最长的

    题解:

    构建Next数组,Next[i]表示以i为末尾的子串的后缀与能够匹配的整个串的最长的前缀。把除了Next[1]和Next[n]的都Hash一下

    然后从x=Next[n]开始找,如果存在其他的Next[x]==Next[n],就说明除了开头和还存在其他的,如果不存在,x=Next[x],即缩小长度继续查找

    代码:

    31 char s[MAXN];
    32 int Next[MAXN];
    33 int Hash[MAXN];
    34 
    35 void buildNext(char P[]) {
    36     int m = strlen(P);
    37     int i = 0, j;
    38     j = Next[0] = -1;
    39     while (i < m) {
    40         while (-1 != j && P[i] != P[j]) j = Next[j];
    41         Next[++i] = ++j;
    42     }
    43 }
    44 
    45 int main() {
    46     scanf("%s", s + 1);
    47     buildNext(s + 1);
    48     int n = strlen(s + 1);
    49     rep(i, 2, n) Hash[Next[i]] = 1;
    50     int x = Next[n];
    51     while (!Hash[x] && x) x = Next[x];
    52     if (!x) return puts("Just a legend"), 0;
    53     rep(i, 1, x + 1) printf("%c", s[i]);
    54     return 0;
    55 }
  • 相关阅读:
    内部类
    抽象类与接口
    多态
    继承
    封装
    创建对象的内存分析
    构造器
    面向对象 类与对象
    uniapp跳转
    uniapp-组件引用错误,仅支持 import 方式引入组件
  • 原文地址:https://www.cnblogs.com/baocong/p/7515658.html
Copyright © 2011-2022 走看看