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 ...
随机推荐
- table中bordercolor属性设置后最新ie浏览器或firefox中不显示边线,借助table的css来实现边线
table中的bordercolor属性设置后在最新的ie或者firefox中均不显示边线,table的边线又是常用功能.只能使用css来实现了,更通用,更方便一些. css: .ctable{ b ...
- MySQL binlog的格式解析
我搜集到了一些资料,对理解代码比较有帮助. 在头文件中binlog_event.h中,有描述 class Log_event_header class Log_event_footer 参见[Myst ...
- bzoj1091: [SCOI2003]切割多边形
Description 有一个凸p边形(p<=8),我们希望通过切割得到它.一开始的时候,你有一个n*m的矩形,即它的四角的坐标分别为(0,0), (0,m), (n,0), (n,m).每次你 ...
- 常见的HTTP返回码如4xx, 5xx
常见的HTTP返回码如4xx, 5xx Client Error =====================400 Bad Request 因为错误的语法导致服务器无法理解请求信息.401 Unaut ...
- ajax批删
- CGI
CGI的工作原理一般是这么定义的: 客户端web浏览器浏览某个主页后,利用一定的方式提交数据,并通过HTTP协议向Web服务器发出请求,服务器端的HTTP Daemon(守护进程)将描述的主页信息通过 ...
- 写给java开发的运维笔记
转载至:https://github.com/biezhi/java-bible/tree/master/learn_server
- asp.net mvc多条件+分页查询解决方案
开发环境vs2010 css:bootstrap js:jquery bootstrap paginator 原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了 ...
- HBase读延迟的12种优化套路
任何系统都会有各种各样的问题,有些是系统本身设计问题,有些却是使用姿势问题.HBase也一样,在真实生产线上大家或多或少都会遇到很多问题,有些是HBase还需要完善的,有些是我们确实对它了解太少.总结 ...
- openssl生成ssl证书
openssl生成ssl证书 x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时 ...