亲和串

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数组的代码:
  1. void get_next(char const * pt , int * next)
  2. {
  3. int i,j=-,len=strlen(pt);
  4. next[i=]=-;
  5. while(i<len)
  6. {
  7. if(j==-||pt[j]==pt[i])
  8. {
  9. ++i;
  10. ++j;
  11. if(pt[j]!=pt[i])
  12. next[i]=j;
  13. else
  14. next[i]=next[j];
  15. }
  16. else
  17. j=next[j];
  18. }
  19. }

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

  1. //next设置为全局变量数组,当然也可以设置下面数组中...
  2. int smatch_kmp(char *ps,char *pt )
  3. {
  4. int lens=strlen(ps); //sizoef(pt)/sizeof(char);
  5. int lent=strlen(pt);
  6. int i=,j=-;
  7. //next[]
  8. get_next(ps,next);
  9. while(i<lens&&j<lent)
  10. {
  11. if(j==-||ps[i]==pt[j])
  12. {
  13. ++i;
  14. ++j;
  15. }
  16. else
  17. j=next[j];
  18. }
  19. if(j==lent)
  20. return i-lent;
  21. else
  22. return -;
  23.  
  24. }

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

代码:

  1. //BF个改进kmp算法....
  2. /*@code龚细军*/
  3. #include<stdio.h>
  4. #include<string.h>
  5. #define maxn 100000
  6. int next[maxn+];
  7. char pps[maxn+],ppt[maxn+];
  8. /*求next数组的值*/
  9. void getnext(char const *pt ,int *next) //t表示目标串 s代表的是主串
  10. {
  11. int i=,j=-;
  12. next[i]=-;
  13. int len=strlen(pt);
  14. while(i<len)
  15. {
  16. if(j==-||pt[i]==pt[j]) //匹配的情况,或者是开始的赋值
  17. {
  18. i++;
  19. j++;
  20. if(pt[i]!=pt[j]) //再次判断是否匹配
  21. {
  22. next[i]=j;
  23. }
  24. else
  25. next[i]=next[j];
  26. }
  27. else
  28. j=next[j];
  29. }
  30. }
  31. //BF的改进kmp
  32. bool smatch_kmp(char const *s ,char const *t)
  33. {
  34. int lens=strlen(s); //到主串的长度
  35. int lent=strlen(t); //得到目标串的长度
  36. memset(next,,sizeof(next));
  37. getnext(ppt,next);
  38. int i=,j=-;
  39. while(i<*lens&&j<lent)
  40. {
  41. if(j==-||s[i%lens]==t[j]) //目前匹配所以都进位i++,j++
  42. {
  43. i++;
  44. j++;
  45. }
  46. else j=next[j]; //如果是BF的话,需要回溯,再j++ ,但是kmp在此处作出了改进,不必全回溯
  47. }
  48. if(j>=lent)
  49. return ; // i-lent; 说明是匹配成功了..
  50. else
  51. return ; //说面并未匹配成功
  52.  
  53. }
  54.  
  55. int main()
  56. {
  57.  
  58. while(scanf("%s%s",pps,ppt)!=EOF)
  59. puts(smatch_kmp(pps,ppt)==true?"yes":"no");
  60. return ;
  61. }

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. 2012年及之后的ImageNet比赛的冠军、亚军和季军ImageNet winners after 2012

    2012 0.15 - Supervision (AlexNet) - ~ 60954656 params 0.26 - ISI (ensemble of features) 0.27 - LEAR ...

  2. Windows 7系统垃圾清理自写程序

    系统清理.bat @echo off color 0a title windows7系统垃圾清理--- echo ★☆ ★☆ ★☆ ★☆ ★☆★☆★☆ ★☆ ★☆ ★☆ ★☆★ echo ★☆ ★☆ ...

  3. 在Ubuntu 12.04 桌面上设置启动器(快捷方式)

    在Ubuntu 12.04 桌面上设置启动器(快捷方式)过程讲解: 如下图所示,Eclipse 和 SQLDeveloper 都可以直接双击打开,这些应用程序的启动器都在 /usr/share/app ...

  4. java之 22天 GUI 图形界面编程(二)

    转自:http://takeme.iteye.com/blog/1876853 模拟window开打文件 import java.awt.Button; import java.awt.Dialog; ...

  5. 【Handler】Looper 原理 详解 示例 总结

    核心知识点 1.相关名词 UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue Handler:作用就是发送与处理信息, ...

  6. 五个瓶颈影响你的Asp.Net程序(网站)性能

    在今天的手机设备世界里,生活的节奏继续加快,因此访问你的网站的用户的耐心也在渐渐失去.同时,我提供了非常多的特性,为了防止你的网站变得过时或者廉价,你必须跟上竞争对手.你想赢得访问者的喝彩,但访问者没 ...

  7. Android实现随机验证码——自定义View

    一.问题描述 熟悉web开发中童鞋们都知道为了防止恶意破解.恶意提交.刷票等我们在提交表单数据时,都会使用随机验证码功能.在Android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个 ...

  8. scala 学习笔记九 定义操作符

    Scala中方法名可以包含几乎所有字符,还可以对操作符+赋予新的含义 上面例子中136行,用下划线来表示“缺省初始化值” 上面151行和153行都是通过圆点表示法进行调用 157行和159行用中缀表示 ...

  9. Linux:su和su-的区别

    大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户.Linux中切换用户的命令是su或su -. 如上图所示,一 ...

  10. leetcode笔记:Sqrt(x)

    一. 题目描写叙述 Implement int sqrt(int x). Compute and return the square root of x. 二. 题目分析 该题要求实现求根公式,该题还 ...