hdu 6208 The Dominator of Strings

2023-11-15

Problem

acm.hdu.edu.cn/showproblem.php?pid=6208

Meaning

有 n 个字符串,问是否能找到其中一串,使得其它串都是它的子串

Analysis

如果存在这个串,那它一定是 n 个中的最长串。所以只要找出最长串,然后看其它串是否都是它的子串。
队友写的 AC自动T,一直超时,后来换成后缀数组过的。
再后来在 AcFun 里听见有 dalao 说 AC自动机 能过,还有用 KMP 和 strstr() 甚至 string 的 find() 过的…(据说不同 AC自动机 模板的常数不同)

Code

#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
const int S = 100000, N = S, M = 26;

int sa[S];

inline bool same(int *rnk, int a, int b, int w)
{
    return rnk[a] == rnk[b] && rnk[a+w] == rnk[b+w];
}

void da(const char *s, int n, int m)
{
    static int rnk[S], tmp[S], cnt[S];
    int *x = rnk, *y = tmp;

    memset(cnt, 0, sizeof cnt);
    for(int i = 0; i < n; ++i)
        ++cnt[x[i] = s[i] - 'a'];
    for(int i = 1; i < m; ++i)
        cnt[i] += cnt[i-1];
    for(int i = n - 1; i >= 0; --i)
        sa[--cnt[x[i]]] = i;

    for(int w = 1; w < n; w <<= 1)
    {
        int num = 0;
        for(int i = n - w; i < n; ++i)
            y[num++] = i;
        for(int i = 0; i < n; ++i)
            if(sa[i] >= w)
                y[num++] = sa[i] - w;

        memset(cnt, 0, sizeof cnt);
        for(int i = 0; i < n; ++i)
            ++cnt[x[i]];
        for(int i = 1; i < m; ++i)
            cnt[i] += cnt[i-1];
        for(int i = n - 1; i >= 0; --i)
            sa[--cnt[x[y[i]]]] = y[i];

        swap(x, y);
        x[sa[0]] = 0;
        num = 1;
        for(int i = 1; i < n; ++i)
            x[sa[i]] = same(y, sa[i-1], sa[i], w) ? num - 1 : num++;

        if(num >= n)
            break;
        m = num;
    }
}

string str[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    while(T--)
    {
        int n;
        cin >> n;
        // 最长串的下标、长度
        int id = 0, ml = 0;
        for(int i = 0; i < n; ++i)
        {
            cin >> str[i];
            if(ml < str[i].length())
            {
                id = i;
                ml = str[i].length();
            }
        }
        // 构建后缀数组
        const char *txt = str[id].c_str();
        da(txt, ml, M);
        // 查询剩余的串是不是最长串的子串
        bool flag = true;
        for(int i = 0; i < n; ++i)
            if(i != id)
        {
            bool found = false;
            int patlen = str[i].length();
            const char *pat = str[i].c_str();
            // 二分文本川(最长串)后缀的字典序
            // 看模式串式不是文本串的这个后缀的一个前缀
            for(int l = 0, r = ml - 1, m, res; l <= r; )
            {
                m = l + r >> 1;
                res = strncmp(pat, txt + sa[m], patlen);
                if(!res)
                {
                    found = true;
                    break;
                }
                else if(res > 0)
                    l = m + 1;
                else
                    r = m - 1;
            }
            // 此串不是最长串的子串
            if(!found)
            {
                flag = false;
                break;
            }
        }
        cout << (flag ? txt : "No") << '\n';
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hdu 6208 The Dominator of Strings 的相关文章

  • libpng warning iCCP 错误处理方法

    png图片缺乏某些库 导致损坏 或者多余了一些数据会导致以下报错 libpng warning iCCP known incorrect sRGB profile libpng warning iccp extra compressed d
  • Unity3D 在Game窗口下查看Overdraw视图

    overdraw简单来说 就是一个像素在荧幕被绘制了多次 在像素处理中 overdraw是最常见的性能瓶颈之一 上个项目中优化过 全屏UI渲染时 游戏主场景在UI后重复绘制 导致完全没有必要的Overdraw 引用 冯乐乐的文章中的一句话
  • 更改SUSE运行级别

    用runlevel可以查看当前的运行级别 init N可临时更改运行级别 如果要在启动时就启用某种运行级别 跟红帽不一样SUSE要更改运行级别可以用以下步骤 红帽只需要步骤1 1 修改 etc inittab id 5 initdefaul

随机推荐

  • 蓝桥杯java技巧总结

    文章目录 一 数据结构 1 哈希表 2 堆 二 对象数组排序 三 时间相关 1 String转Date 2 Date转String 标准格式化 3 Calender类 日历 星期 4 计算时间间隔 四 字符串 1 int和String的互相
  • 基于网易云音乐的歌词js逆向

    歌曲的歌词 一 py源码 import json import execjs import requests 实例话一个node对象 node execjs get js源文件编译 ctx node compile open 网易云2号 j
  • 微博模型训练——僵尸用户识别(二)

    上文通过使用决策树算法简单实现了僵尸用户的识别 https blog csdn net weixin 43906500 article details 116992642 本文综合利用多种机器学习方法实现对僵尸用户的识别 使用的机器学习方法
  • shell 实现目录下文件修改记录监控

    文件监控可以配合rsync实现文件自动同步 例如监听某个目录 当文件变化时 使用rsync命令将变化的文件同步 可用于代码自动发布 inotify 是linux内核的一个特性 在内核 2 6 13 以上都可以使用 如果在shell环境下 可
  • u3d修改服务器ip,Unity ping一个服务器 ip 的工具类

    using UnityEngine using System Collections public class UnityPing MonoBehaviour private static string s ip private stati
  • mysql使用sql语句根据时间段查询数据

    1 sql语句 SELECT 字段 from 表名 where 时间字段 BETWEEN 2019 05 22 AND 2019 06 21 注 此种方法查到的是5 22到6 20之间数据 不包括6 21当天的数据 2 在mybatis中m
  • MySQL如何查看,删除用户

    1 查看所有用户 需要在root用户下进行 select host user password from mysql user 2 删除用户 mysql gt Delete FROM user Where User 用户名 and Host
  • LU矩阵分解

    LU分解 Pseudocode LU matrix decompose matrix for j 0 1 n L 为单位下三角矩阵 L j j 1 0 上三角矩阵的行列索引关系 j rows gt i columns for i 0 1 j
  • php socket 错误处理,PHP Socket or TCP 连接错误信息显示乱码问题处理

    错误说明 在项目中编码都是使用UTF 8编码 当用到Socket或者TCP连接的时候出现错误 错误信息不是UTF 8的编码 所以输出看到的是乱码且在输出json格式输出的时候是空白 比如在本地位win7系统 错误信息提示 Can not c
  • 多智能体强化学习与博弈论-博弈论基础3

    多智能体强化学习与博弈论 博弈论基础3 之前主要介绍了如何判断博弈中是否到达了纳什均衡 在这篇文章中将主要介绍如何计算纳什均衡 本文主要介绍下列几种情况下的纳什均衡 两个智能体 每个智能体有两个动作 两个智能体 每个智能体有多个动作 零和博
  • MySql Windows安装教程

    找到下载 gt 拉到最下面找到社区版下载 gt 下载 下面是我下载好的 度盘链接 提取码 sws3 解压到指定目录 Mysql国内镜像 Index of mysql MySQL 8 0 此时解压后的文件中没有data目录和ini文件 然后做
  • 帆软大屏开发手册

    1 需求调研 模块 输出 业务需求调研 业务需求调研报告 硬件调研 大屏采购硬件清单 数据调研 数据质量调研报告 关键性技术预研 技术预研报告 1 1 业务需求调研 1 1 1 根据业务场景抽取关键指标 关键指标是一些概括性词语 是对一组或
  • 使用Python,Keras和TensorFlow训练第一个CNN

    使用Python Keras和TensorFlow训练第一个CNN 这篇博客将介绍如何使用Python和Keras训练第一个卷积神经网络架构 ShallowNet 并在动物和CIFAR 10数据集上对其进行了训练 ShallowNet对动物
  • python+PyCharm+OpenCV配置

    文章目录 一 python的配置 二 PyCharm的安装 三 OpenCV的配置 一 python的配置 第一步 下载python安装包 从python的官网 python下载地址 中找到最新版本的python安装包 点击进行下载即可 需
  • python实现——处理Excel表格(超详细)

    目录 xls和xlsx 基本操作 1 用openpyxl模块打开Excel文档 查看所有sheet表 2 1 通过sheet名称获取表格 2 2 获取活动表 3 1 获取表格的尺寸 4 1 获取单元格中的数据 4 2 获取单元格的行 列 坐
  • 睿智的目标检测56——Pytorch搭建YoloV5目标检测平台

    睿智的目标检测56 Pytorch搭建YoloV5目标检测平台 学习前言 源码下载 YoloV5改进的部分 不完全 YoloV5实现思路 一 整体结构解析 二 网络结构解析 1 主干网络Backbone介绍 2 构建FPN特征金字塔进行加强
  • Arria 10上进行DDR3管脚分配

    本文介绍下DDR3的管脚分配 其它系列的DDR管脚分配也基本一样的 FPGA型号 10AX027H4F34I3SG DDR3型号 MT41J128M16JT 125 QuartusI Prime18 0 首先介绍下A10器件能支持的DDR系
  • 图像处理和图像识别中常用的matlab函数

    下面仅给出函数的大概意思 详细用法见 help 函数名 或 matlab help 1 imread read image from graphics file 2 imshow display image in Handle Graphi
  • MySQL高性能及性能优化技巧---更适合开发人员

    更新次数 更新时间 首发 2021 10 25 第一次更新 2021 10 26 1 删除了书中大量不必要的存储引擎类型 2 摘要完毕Mysql架构与历史部分 第二次更新 2021 10 29 1 摘要基准测试内容 2 删除了大量对概念的举
  • hdu 6208 The Dominator of Strings

    Problem acm hdu edu cn showproblem php pid 6208 Meaning 有 n 个字符串 问是否能找到其中一串 使得其它串都是它的子串 Analysis 如果存在这个串 那它一定是 n 个中的最长串