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的更多相关文章

  1. HDOJ 1238 Substrings 【最长公共子串】

    HDOJ 1238 Substrings [最长公共子串] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  2. hdoj 1686 kmp

    题目:   Sample Input 3 BAPC BAPC AZA AZAZAZA VERDI AVERDXIVYERDIAN   Sample Output 1 3 0     代码:   #in ...

  3. (KMP 字符串处理)Substrings -- hdu -- 1238

    http://acm.hdu.edu.cn/showproblem.php?pid=1238 Substrings Time Limit:1000MS     Memory Limit:32768KB ...

  4. HDOJ 2203 亲和串 【KMP】

    HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdoj 3746 Cyclic Nacklace【KMP求在结尾加上多少个字符可以使字符串至少有两次循环】

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. hdoj 5311 Hidden String(KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5311 思路分析:该问题要求在字符串中是否存在三个不相交的子串s[l1..r1], s[l2..r2], ...

  7. hdu 1238 Substrings(kmp+暴力枚举)

    Problem Description You are given a number of case-sensitive strings of alphabetic characters, find ...

  8. HDOJ Oulipo 1686【KMP】

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. KMP HDOJ 4300 Clairewd's message

    题目传送门 题意:完全不懂,最后还是看题解才理解了.第一行字符串是密文变成明文的规则,比如第二个样例:“qwertyuiopasdfghjklzxcvbnm”,‘q'对应的明文为’a','w'对应'b ...

随机推荐

  1. js点击后将文字复制到剪贴板,将图片复制到剪贴板

    复制文字: <table width="99%" border="0" cellpadding="0" cellspacing=&qu ...

  2. 数据挖掘之KNN算法(C#实现)

    在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...

  3. [Maven]Apache Maven 入门篇

    作者:George Ma 上 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 ma ...

  4. vue组件一

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. opencv从txt文本读取像素点并显示

    opencv从txt文本读取像素点并显示 文本储存格式为每行一个像素点,排列为RGB.每帧图像的帧头为65535.  如下图所示 废话不多说,代码如下: // #include <iostrea ...

  6. Visual Studio最好用的快捷键

    当然每个人常用的一般都会有些不一样,欢迎大家评论说出自己常用或最常用的快捷键吧,比比看谁用的巧~~~ ctrl+-(shift+ctrl+-):移动光标到上次位置或相反,比如定位一个函数,转到函数定义 ...

  7. oracle修改字符集

    在linux下面安装了oracle 11G,由于安装的时候没有注意导致字符集问题,impdp导入操作后中文乱码. 1.用命令select userenv('language') from dual; ...

  8. Docker 的 Image 太大,怎么变小?

    铛~铛~铛~Docker即将颠覆整个软件产业,从云计算平台到软件开发.测试,整个SDLC都会极度依赖Docker. 圈子里面一定有很多讨论Docker的话题,简而言之,Docker其实只解决一个问题: ...

  9. prototype.js简介

    prototype.js简介 2007-11-21 14:22 prototype.js是一个很强大的Javascript函数库,它可以让你很轻松的使用一些特效,实现AJAX的功能.虽然prototy ...

  10. C语言fmod()函数:对浮点数取模(求余)

    头文件:#include <math.h> fmod() 用来对浮点数进行取模(求余),其原型为:    double fmod (double x); 设返回值为 ret,那么 x = ...