HDUOJ---(2203)亲和串
亲和串
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6579 Accepted Submission(s): 2976
- 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)亲和串的更多相关文章
- HUD 2203 亲和串
HUD 2203 亲和串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768K (Java/Others) [题目描述 - ...
- HDOJ 2203 亲和串 【KMP】
HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 2203 亲和串(KMP)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2203 题目: 亲和串 Time Limit: 3000/1000 MS (Java/Others) ...
- hdu 2203:亲和串(水题,串的练习)
亲和串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdoj 2203 亲和串
亲和串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDOJ/HDU 2203 亲和串(简单的判断~Java的indexOf()方法秒)
Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现 ...
- hdu 2203 亲和串
把T串扩展成两倍 然后KMP 注意T的长度要大于P的长度 #include <iostream> #include <cstdio> #include <cstri ...
- hdu 2203亲和串 (kmp)
#include<cstdio>#include<iostream>#include<cstring>#include<string>using nam ...
- 【HDU 2203】亲和串
题 题意 给你一个字符串s1,字符串s2,s1循环移位,使s2包含在s1中,则s2 是s1的亲和串 分析 把s1自身复制一遍接在后面. 方法一: 用strstr函数. 方法二: KMP算法. 方法三: ...
- HDU2203 亲和串
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
随机推荐
- 2012年及之后的ImageNet比赛的冠军、亚军和季军ImageNet winners after 2012
2012 0.15 - Supervision (AlexNet) - ~ 60954656 params 0.26 - ISI (ensemble of features) 0.27 - LEAR ...
- Windows 7系统垃圾清理自写程序
系统清理.bat @echo off color 0a title windows7系统垃圾清理--- echo ★☆ ★☆ ★☆ ★☆ ★☆★☆★☆ ★☆ ★☆ ★☆ ★☆★ echo ★☆ ★☆ ...
- 在Ubuntu 12.04 桌面上设置启动器(快捷方式)
在Ubuntu 12.04 桌面上设置启动器(快捷方式)过程讲解: 如下图所示,Eclipse 和 SQLDeveloper 都可以直接双击打开,这些应用程序的启动器都在 /usr/share/app ...
- java之 22天 GUI 图形界面编程(二)
转自:http://takeme.iteye.com/blog/1876853 模拟window开打文件 import java.awt.Button; import java.awt.Dialog; ...
- 【Handler】Looper 原理 详解 示例 总结
核心知识点 1.相关名词 UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue Handler:作用就是发送与处理信息, ...
- 五个瓶颈影响你的Asp.Net程序(网站)性能
在今天的手机设备世界里,生活的节奏继续加快,因此访问你的网站的用户的耐心也在渐渐失去.同时,我提供了非常多的特性,为了防止你的网站变得过时或者廉价,你必须跟上竞争对手.你想赢得访问者的喝彩,但访问者没 ...
- Android实现随机验证码——自定义View
一.问题描述 熟悉web开发中童鞋们都知道为了防止恶意破解.恶意提交.刷票等我们在提交表单数据时,都会使用随机验证码功能.在Android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个 ...
- scala 学习笔记九 定义操作符
Scala中方法名可以包含几乎所有字符,还可以对操作符+赋予新的含义 上面例子中136行,用下划线来表示“缺省初始化值” 上面151行和153行都是通过圆点表示法进行调用 157行和159行用中缀表示 ...
- Linux:su和su-的区别
大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户.Linux中切换用户的命令是su或su -. 如上图所示,一 ...
- leetcode笔记:Sqrt(x)
一. 题目描写叙述 Implement int sqrt(int x). Compute and return the square root of x. 二. 题目分析 该题要求实现求根公式,该题还 ...