原题大意:原题链接

给出n个字符串,找出一个最长的串s,使s或者s的反转字符串(只要其中一个符合就行)同时满足是这n个串的子串。

对于样例,第一组ABCD   BCDFF  BRCD最长的串就是CD;第二组rose  orchid最长的子串就是ro

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char str[][];
int next[],rnext[]; /*
void get_next(char *s)
{
next[1]=0;
int i=1,j=0;
int slen=strlen(s);
while(i<slen){
if(j==0||s[i-1]==s[j-1]){
i++,j++;
next[i]=j;
}
else j=next[j];
}
}
在t字符串在s字符串中匹配
bool KMP(char *s,char *t)
{
int i=0,j=1;
int slen=strlen(s),tlen=strlen(s);
while(i<=slen&&j<=tlen){
if(j==0||s[i-1]==t[j-1])
i++,j++;
else j=next[j];
}
if(j>tlen)
return true;
return false;
}
*/
void get_next(int l,int r,bool flag)
{
if(flag){
next[l]=l-;
int i=l,j=l-;
while(i<r){
if(j==l-||str[][i]==str[][j]){
i++,j++;
next[i]=j;
}
else j=next[j];
}
}
else{
rnext[r]=r+;
int i=r,j=r+;
while(i>l){
if(j==r+||str[][i]==str[][j]){
i--,j--;
rnext[i]=j;
}
else j=rnext[j];
}
}
}
//将第一个字符串的l~r位置在第k个字符串中进行匹配
bool KMP(int id,int l,int r,bool flag)
{
int len=strlen(str[id]);
if(flag){
int i=,j=l;
while(i<len&&j<=r){
if(j==l-||str[id][i]==str[][j])
i++,j++;
else j=next[j];
}
if(j>r) return true;
}
else{
int i=,j=r;
while(i<len&&j>=l){
if(j==r+||str[id][i]==str[][j])
i++,j--;
else j=rnext[j];
}
if(j<l) return true;
}
return false;
} int main()
{
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%s",str[i]);
int len=strlen(str[]),ans=;
for(int i=;i<len;i++){
for(int j=i;j<len;j++){
int len=j-i+;
get_next(i,j,true);
get_next(i,j,false);
int cnt=;
for(int k=;k<n;k++){
if(KMP(k,i,j,true)||KMP(k,i,j,false))
cnt++;
else break;
}
if(cnt==n&&ans<len) ans=len;
}
}
printf("%d\n",ans);
}
return ;
}

PKU 1226 Substrings(字符串匹配+暴搜KMP模板)的更多相关文章

  1. 模式字符串匹配问题(KMP算法)

    这两天又看了一遍<算法导论>上面的字符串匹配那一节,下面是实现的几个程序,可能有错误,仅供参考和交流. 关于详细的讲解,网上有很多,大多数算法及数据结构书中都应该有涉及,由于时间限制,在这 ...

  2. 神奇的字符串匹配:扩展KMP算法

    引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...

  3. 【字符串匹配】UVALive 4670 模板题

    给一个文本T,和n个模板字符串,都是由小写字母组成,问这些字符串那些在字符串中出现的次数最多,输出最多的次数以及相应的字符串. AC自动机的模板题,递归输出的时候改成累加次数统计数组cnt即可. 大白 ...

  4. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  5. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  6. P3375 【模板】KMP字符串匹配

    P3375 [模板]KMP字符串匹配 https://www.luogu.org/problemnew/show/P3375 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在 ...

  7. P3375【模板】KMP字符串匹配

    前言: 额……很久以前就写了KMP模板(只是半知不解),话说看完了manacher,再回过头看KMP,是真TM简单啊!字符串专题整体较抽象,所以必须牢记思路并时常复习 题目描述 如题,给出两个字符串s ...

  8. 洛谷—— P3375 【模板】KMP字符串匹配

    P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如 ...

  9. KMP字符串匹配 模板 洛谷 P3375

    KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...

随机推荐

  1. 剑指 offer set 15 第一个只出现一次的字符

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符 思路: 1. 给定的题目约束比较多, 因此可以自定义哈希函数 2. 字符是一个长 ...

  2. 开发中常用Fel的写法

    直接看代码吧: package javademo; import java.util.HashMap;import java.util.Map; import com.greenpineyu.fel. ...

  3. 《C++ Primer Plus》第3章 处理数据 学习笔记

    C++的基本类型分为两组:一组由存储为证书的值组成,另一组由存储为浮点格式的值组成.整型之间通过存储键值时使用的呢存及有无符号来区分.整型从最小到最大依次是:bool,char,signed char ...

  4. python 绘制3D散点图

    import scipy.io as sio from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt a = [ ...

  5. nat123动态域名解析软件使用教程

    nat123动态域名解析软件使用教程

  6. 《从零开始学Swift》学习笔记(Day 10)——运算符是“ +、-、*、/ ”吗?

    原创文章,欢迎转载.转载请注明:关东升的博客 运算符是用于执行程序代码运算,会针对一个或一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是“+”.那么“+.-.*./”是运算符 ...

  7. Android开源项目分类汇总【畜生级别】

    From :http://blog.csdn.net/forlong401/article/details/25459403?c=6c4cd677a617db4655988e41ee081691#t7 ...

  8. linux的简单查找的方法

    catalina.out文件查找指定行sed -n 346492p catalina.out 查找第几到第几行sed -n 346200,346692p catalina.out 查找指定内容(不区分 ...

  9. java enum(枚举)使用详解 + 总结(转载)

    enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容: 1. 原始 ...

  10. 170404、java版ftp操作工具类

    package com.rick.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...