HDOJ(1238) KMP
Substrings
http://acm.hdu.edu.cn/showproblem.php?pid=1238
先找到长度最短的字符串,把它的子串和该子串的逆序(按长度从大到小)依次与其他字符串匹配。
如果某个子串或它的逆序(如:“ro” ,”or“)和其他字符串都匹配,就返回此时的长度。
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
using namespace std; //下标以0开始的KMP
void get_next(string b, int *next)
{
int i=;
int j=-;
next[i]=-;
int len_b=b.size();
while(i<len_b-)
{
if(j==-||b[i]==b[j])
{
++i;
++j;
if(b[i]!=b[j])
next[i]=j;
else
next[i]=next[j];
}
else
{
j = next[j];
}
}
} int KMP(string a,string b)
{
int i=;
int j=;
int len_a=a.size();
int len_b=b.size();
int next[];
get_next(b,next);
while(i<len_a&&j<len_b)
{
if(j==-||a[i]==b[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>=len_b)
return ;
else
return ;
} int solve(vector<string> str,int mini)
{
string sub1,sub2;
int i,j,k,m,res=;
int len=str[mini].size();
for(i=len;i>=;i--)
{
for(j=;i+j<=len;j++)
{
sub1=str[mini].substr(j,i); //选取str[mini]中以j开头长度为i的字串
sub2=sub1;
reverse(sub2.begin(),sub2.end());//逆置字符串
int l=str.size();
for(k=;k<l;k++)
{
string s=str[k];
if(KMP(s,sub1)==&&KMP(s,sub2)==)
{
break;
}
}
if(k>=l)
{ res=i;
goto A;
}
}
}
A: return res;
}
int main()
{
int t,n,i,mini;
vector<string> str;
string s;
scanf("%d",&t);
while(t--)
{
str.clear();
scanf("%d",&n);
for(i=;i<n;i++)
{
cin>>s;
str.push_back(s);
}
mini=;
int len=str.size();
for(i=;i<len;i++)
{
if(str[i].size()<str[mini].size())
{
mini=i;
}
}
printf("%d\n",solve(str,mini));
}
return ;
}
KMP模板
下标以0开始
void get_next(string b, int *next)
{
int i=;
int j=-;
next[i]=-;
int len_b=b.size();
while(i<len_b-)
{
if(j==-||b[i]==b[j])
{
++i;
++j;
if(b[i]!=b[j])
next[i]=j;
else
next[i]=next[j];
}
else
{
j = next[j];
}
}
} int KMP(string a,string b)
{
int i=;
int j=;
int len_a=a.size();
int len_b=b.size();
int next[];
get_next(b,next);
while(i<len_a&&j<len_b)
{
if(j==-||a[i]==b[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>=len_b)
return i-len_b;
else
return ;
}
下标从1开始
void get_next(char *b,int *next)
{
int i=;
int j=;
next[]= ;
int len_b=strlen(b)-; //下标从1开始,子串的长度=strlen(b)-1
while(i<len_b)
{
if(j==||b[i]==b[j]) //b[i]表示后缀的单个字符
{ //b[j]表示前缀的单个字符
++i;
++j;
if (b[i]!=b[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j]; //若字符不相同,则j值回溯
}
}
int KMP(char *a,char *b,int pos)
{
int i=pos; //i用于主串a当前位置下标值
//若pos不为1,则从pos开始
int j=; //j用于字串b当前位置下标值
int len_a=strlen(a)-;
int len_b=strlen(b)-;
int next[];
get_next(b,next); //对字串b分析,得到next数组
while(i<=len_a&&j<=len_b)
{
if(j==||a[i]==b[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>len_b)
return i-len_b;
else
return ;
}
下标以1开始的next数组,实际上,是下标以0开始的next数组的值+1。KMP算法最重要的是得到子串的next[]。
HDOJ(1238) KMP的更多相关文章
- HDOJ 1238 Substrings 【最长公共子串】
HDOJ 1238 Substrings [最长公共子串] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- hdoj 1686 kmp
题目: Sample Input 3 BAPC BAPC AZA AZAZAZA VERDI AVERDXIVYERDIAN Sample Output 1 3 0 代码: #in ...
- (KMP 字符串处理)Substrings -- hdu -- 1238
http://acm.hdu.edu.cn/showproblem.php?pid=1238 Substrings Time Limit:1000MS Memory Limit:32768KB ...
- HDOJ 2203 亲和串 【KMP】
HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdoj 3746 Cyclic Nacklace【KMP求在结尾加上多少个字符可以使字符串至少有两次循环】
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdoj 5311 Hidden String(KMP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5311 思路分析:该问题要求在字符串中是否存在三个不相交的子串s[l1..r1], s[l2..r2], ...
- hdu 1238 Substrings(kmp+暴力枚举)
Problem Description You are given a number of case-sensitive strings of alphabetic characters, find ...
- HDOJ Oulipo 1686【KMP】
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- KMP HDOJ 4300 Clairewd's message
题目传送门 题意:完全不懂,最后还是看题解才理解了.第一行字符串是密文变成明文的规则,比如第二个样例:“qwertyuiopasdfghjklzxcvbnm”,‘q'对应的明文为’a','w'对应'b ...
随机推荐
- winform中dataGridView单元格根据值设置新值,彻底解决绑定后数据类型转换的困难
// winform中dataGridView单元格在数据绑定后,数据类型更改困难,只能迂回实现.有时候需要将数字变换为不同的文字描述,就会出现int32到string类型转换的异常,借助CellFo ...
- Node.js基础与实战
Node.js基础与实战 Node.jsJS高级进阶 NODE原理与解析 REPL交互环境 模块与NPM Buffer缓存区 fs文件操作 Stream流 TCP&UDP 异步编程 HTTP& ...
- Codeforces Round #381 (Div. 2)D. Alyona and a tree(树+二分+dfs)
D. Alyona and a tree Problem Description: Alyona has a tree with n vertices. The root of the tree is ...
- dubbo-admin和dubbo-monitor-simple的布署
dubbo-admin 把dubbo-admin的war包解压到tomcat或者jetty的ROOT目录下,启动就可以访问了(自己配置tomcat的端口) wget http://code.aliba ...
- mysql解决Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
同步发布:http://www.yuanrengu.com/index.php/mysqlsolvetimestamp.html 在使用mysql时,如果数据库中的字段类型是timestamp,默认为 ...
- C#中属性与字段的用法
//People.cs public class People { //字段 private string _name; //属性 作用:保护字段,对字段的取值和赋值进行限定,限制非法字段的摄入 pu ...
- Tab切换
代码 <!DOCTYPE html> <html lang="en"><head> <meta charset="UTF-8&q ...
- 用直接路径(direct-path)insert提升性能的两种方法
1.传统串行insert方式 常见的insert方式有两种: (1) insert into table_name values(....) (2) insert into target_table ...
- peer not authenticated error
问题背景 系统:OS X El Capitan,10.11.2 IDE:Android Studio 2.0 Preview Java:1.8.0_65 Gradle:2.3 clone了代码后,在i ...
- Java的常用对象①②
Java的常用对象① Java的常用对象有很多,这里只对lang包中常用的Object,Date(Calendar,DateFormat,Math),System,Runtime进行介绍.㈠Objec ...