亲和串

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6579    Accepted Submission(s): 2976

Problem Description
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。 亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
 
Input
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
 
Output
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
 
Sample Input
AABCD
CDAA
ASD
ASDF
 
Sample Output
yes no
 
Author
Eddy
 
采用的是kmp算法思想,只是由于当做一个环来处理,比如前面的AABCD--->AABCDAABCD这样处理就可以了。但是用数组的话求余就可以更好的实现...
有关kmp算法,其实大部分内容还是BF算法的知识,只是添加了一个next数组,来安排匹配串t不匹配时回溯的位置,而主串是不回溯的.....
求next数组的代码:
 void get_next(char const * pt , int  * next)
{
int i,j=-,len=strlen(pt);
next[i=]=-;
while(i<len)
{
if(j==-||pt[j]==pt[i])
{
++i;
++j;
if(pt[j]!=pt[i])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}

有了上面这个函数,下面的kmp部分其实就是BF算法;
代码如下:

 //next设置为全局变量数组,当然也可以设置下面数组中...
int smatch_kmp(char *ps,char *pt )
{
int lens=strlen(ps); //sizoef(pt)/sizeof(char);
int lent=strlen(pt);
int i=,j=-;
//next[]
get_next(ps,next);
while(i<lens&&j<lent)
{
if(j==-||ps[i]==pt[j])
{
++i;
++j;
}
else
j=next[j];
}
if(j==lent)
return i-lent;
else
return -; }

所以此题的代码不难想到了为:

代码:

 //BF个改进kmp算法....
/*@code龚细军*/
#include<stdio.h>
#include<string.h>
#define maxn 100000
int next[maxn+];
char pps[maxn+],ppt[maxn+];
/*求next数组的值*/
void getnext(char const *pt ,int *next) //t表示目标串 s代表的是主串
{
int i=,j=-;
next[i]=-;
int len=strlen(pt);
while(i<len)
{
if(j==-||pt[i]==pt[j]) //匹配的情况,或者是开始的赋值
{
i++;
j++;
if(pt[i]!=pt[j]) //再次判断是否匹配
{
next[i]=j;
}
else
next[i]=next[j];
}
else
j=next[j];
}
}
//BF的改进kmp
bool smatch_kmp(char const *s ,char const *t)
{
int lens=strlen(s); //到主串的长度
int lent=strlen(t); //得到目标串的长度
memset(next,,sizeof(next));
getnext(ppt,next);
int i=,j=-;
while(i<*lens&&j<lent)
{
if(j==-||s[i%lens]==t[j]) //目前匹配所以都进位i++,j++
{
i++;
j++;
}
else j=next[j]; //如果是BF的话,需要回溯,再j++ ,但是kmp在此处作出了改进,不必全回溯
}
if(j>=lent)
return ; // i-lent; 说明是匹配成功了..
else
return ; //说面并未匹配成功 } int main()
{ while(scanf("%s%s",pps,ppt)!=EOF)
puts(smatch_kmp(pps,ppt)==true?"yes":"no");
return ;
}

HDUOJ---(2203)亲和串的更多相关文章

  1. HUD 2203 亲和串

    HUD 2203 亲和串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768K (Java/Others) [题目描述 - ...

  2. HDOJ 2203 亲和串 【KMP】

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

  3. HDU 2203 亲和串(KMP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2203 题目: 亲和串 Time Limit: 3000/1000 MS (Java/Others)   ...

  4. hdu 2203:亲和串(水题,串的练习)

    亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. hdoj 2203 亲和串

    亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. HDOJ/HDU 2203 亲和串(简单的判断~Java的indexOf()方法秒)

    Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现 ...

  7. hdu 2203 亲和串

    把T串扩展成两倍   然后KMP  注意T的长度要大于P的长度 #include <iostream> #include <cstdio> #include <cstri ...

  8. hdu 2203亲和串 (kmp)

    #include<cstdio>#include<iostream>#include<cstring>#include<string>using nam ...

  9. 【HDU 2203】亲和串

    题 题意 给你一个字符串s1,字符串s2,s1循环移位,使s2包含在s1中,则s2 是s1的亲和串 分析 把s1自身复制一遍接在后面. 方法一: 用strstr函数. 方法二: KMP算法. 方法三: ...

  10. HDU2203 亲和串

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

随机推荐

  1. List 集合转换为String

    开发中会用到把 List<string>  的内容拼接成以逗号分隔的字符串的形式,现总结如下: 方法一: public String listToString(List list, cha ...

  2. latex用法疑难解析

    latex用法疑难解析 1.问题:如何生成ps(PostScript)文件? 回答: 方法有二 (1)用dvips这个工具,在WinEdt编辑器中专门有一个按钮: (2)如果使用windows系统的话 ...

  3. eclipse maven 报错Could not get the value for parameter encoding for plugin execution default

    问题描述:更改默认的maven仓库路径完成后.即存maven项目或者新建maven项目的时候出现如下错误 Could not get the value for parameter encoding ...

  4. 同时启动多个Tomcat服务器

    以下步骤能够同时启动两个tomcat:1.特别要注意:不要设置CATALINA_HOME 2.分别修改安装目录下的conf子目录中的server.xml文件: a.修改http访问端口(默认为8080 ...

  5. LigerUI之Grid使用详解(三)——字典数据展示

    一.问题概述 在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏览器兼容问题,提升开发效率.在关于LigerGrid的前两篇的内容里,给大家 ...

  6. kafka基本原理概述——patition与replication分配

    kafka一直在大数据中承受着数据的压力也扮演着对数据维护转换的角色,下面重点介绍kafka大致组成及其partition副本的分配原则: 文章参考:http://www.linkedkeeper.c ...

  7. WordPress 后台添加额外选项字段到常规设置页面

    有时候我们需要添加一些额外的设置选项到常规设置(后台 > 设置 > 常规)页面,下面是一个简单的范例: 直接添加到主题的 functions.php 即可:   /*** WordPres ...

  8. Unity异步加载场景loading条

    using UnityEngine; using System.Collections; public class LoadingScene : MonoBehaviour { public UISl ...

  9. Jade的奇怪解析问题。

    如下的jade代码: span#span1 Span#span2   解析的时候span2总是变成span1的子元素.怎么解决? [解决方法] 用如下的代码就可以了. span#span1 |   s ...

  10. springboot h2数据库的配置

    配置文件 #h2 数据库配置 #配置数据库连接地址spring.datasource.url=jdbc:h2:sunniwell:sos#配置数据库驱动spring.datasource.driver ...