PKU 1226 Substrings(字符串匹配+暴搜KMP模板)
原题大意:原题链接
给出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模板)的更多相关文章
- 模式字符串匹配问题(KMP算法)
这两天又看了一遍<算法导论>上面的字符串匹配那一节,下面是实现的几个程序,可能有错误,仅供参考和交流. 关于详细的讲解,网上有很多,大多数算法及数据结构书中都应该有涉及,由于时间限制,在这 ...
- 神奇的字符串匹配:扩展KMP算法
引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...
- 【字符串匹配】UVALive 4670 模板题
给一个文本T,和n个模板字符串,都是由小写字母组成,问这些字符串那些在字符串中出现的次数最多,输出最多的次数以及相应的字符串. AC自动机的模板题,递归输出的时候改成累加次数统计数组cnt即可. 大白 ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- P3375 【模板】KMP字符串匹配
P3375 [模板]KMP字符串匹配 https://www.luogu.org/problemnew/show/P3375 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在 ...
- P3375【模板】KMP字符串匹配
前言: 额……很久以前就写了KMP模板(只是半知不解),话说看完了manacher,再回过头看KMP,是真TM简单啊!字符串专题整体较抽象,所以必须牢记思路并时常复习 题目描述 如题,给出两个字符串s ...
- 洛谷—— P3375 【模板】KMP字符串匹配
P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如 ...
- KMP字符串匹配 模板 洛谷 P3375
KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...
随机推荐
- zabbix服务器搭建
zabbix服务器源码安装 参看官方文档 这里不做过多的翻译,我的系统是centos6.5,安装的时候是base安装,所以要装一些其他依赖包,除此之外,还有一些php插件: extension=bcm ...
- commit命令
git commit -m "测试提交"
- hdu 2105:The Center of Gravity(计算几何,求三角形重心)
The Center of Gravity Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- python之简单的get和post请求
1.json 模块提供了一种很简单的方式来编码和解码JSON数据. 其中两个主要的函数是 json.dumps() 和 json.loads() , 要比其他序列化函数库如pickle的接口少得多. ...
- JavaScript 事件循环 — event loop
引言 相信所有学过 JavaScript 都知道它是一门单线程的语言,这也就意味着 JS 无法进行多线程编程,但是 JS 当中却有着无处不在的异步概念 .在初期许多人会把异步理解成类似多线程的编程模式 ...
- 快学scala习题解答--第五章 类
5 类 5.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数 class Count{ private var value = Int.MaxValue else v ...
- Struts2_day01--课程安排_Struts2概述_入门
Struts2_day01 Struts2课程安排 今天内容 Struts2概述 Struts2框架入门 导入源文件 Struts2执行过程 查看源代码 Struts2的核心配置文件 标签packag ...
- Linux命令之乐--test
官方文档: help test File operators: -a FILE True if file exists. -b FILE True if file is block special. ...
- 《C++ Primer Plus》学习笔记 2.1.3 C++预处理器和iostream文件
程序清单2-1 myfirst.cpp // myfirst.cpp -- displays a message #include <iostream> // a PREPROCESSOR ...
- std::lock_guard
/* std::lock_guard:更方便线程对于互斥量的上锁操作 std::lock_guard:在定义一个lock_guard时上锁,保证在析构或者异常时解锁 */ #include <i ...