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. Kubernetes系统架构简介

    1. 前言 Together we will ensure that Kubernetes is a strong and open container management framework fo ...

  2. Xposed Module开发教程1

    看了一下文档,发现Xposed这货实在太强大了,它直接对Zygote做了一些手脚,简直是无所不能.缺点就是需要安装一下框架.基本原理就是把Android 系统的app_process给替换了,然后启动 ...

  3. 代码管理 – SVN

    代码管理工具也用了不少年了,整理下. 管理工具比较 用过VSS,CVS,TFS,SVN还有一个微软内部使用的不记得什么名字了.这里进行一些简单比较,重点介绍SVN的用法. CVS历史悠久,1986年就 ...

  4. php中序列化与反序列化

    解析PHP多种序列化与反序列化的方法 序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更 ...

  5. 69 个经典 Spring 面试题和答案

    Spring 概述 什么是spring?Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring 框架目标 ...

  6. 给iOS开发新手送点福利,简述文本属性Attributes的用法

    给iOS开发新手送点福利,简述文本属性Attributes的用法   文本属性Attributes 1.NSKernAttributeName: @10 调整字句 kerning 字句调整 2.NSF ...

  7. Win10 disable 最近打开

    1. 开始菜单 -> Settings -> Personalization -> Start 2. Set "Show most used apps" Off ...

  8. Burp SuiteBurp Suite使用详解

    http://www.2cto.com/Article/201209/153312.html Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改 ...

  9. __doPostBack()没有定义解决方法(转)

    有的时候想在客户端触发服务器端控件的click事件 我们这么写__doPostBack('id','') 但是为什么有的时候会失效? 因为__doPostBack()函数并没有在页面产生(如果没有类似 ...

  10. ubuntu12.04下一个简单的conky安装

    这个conky用一些漂亮的圆圈来显示cpu,时钟,内存,交换空间,硬盘信息,网络及天气信息(不需要登陆任何网站噢).而且,提供多种色彩方案供选择,带发行版标记(fedora,mint,debian,o ...