热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kmphdu1711

kmp让自己意识到自己到底是有多么的水.纠结了好几天,终于对kmp算是有了一个比较浅显的认识.   打开任何一篇关于kmp的文章后,你都会接触一个叫做next数组的东西,其实,不

     kmp让自己意识到自己到底是有多么的水.纠结了好几天,终于对kmp算是有了一个比较浅显的认识.
    打开任何一篇关于kmp的文章后,你都会接触一个叫做next数组的东西,其实,不管七大姨八大姑,kmp的关键就是求一个字符串的前缀和后缀的最大公共长度,不知我说的准确吧,那么我们就应该找出与此有关的东西来.我们以"ababaca"为例尝试着计算next数组.
    首先我们先了解一下前缀后缀的概念.
    前缀:除最后一个字符的所有字符组合;后缀:除第一个字符的的所有字符组合.
"ababaca" 前缀为
    
    "a,ab,aba,abab,ababa,ababac"
    后缀为
    "a,ca,aca,baca,abaca,babaca"
不要被迷惑,这只是指向第6个(从0开始)字母a的前缀,那么我们可以数数只有a自己相同,所以next[6]=1;我们现在将指向"ababaca"中第四个(从0开始)a,它的前缀为:"a,ab,aba,abab",后缀为"a,ba,aba,baba",前后对比一下,"aba"就是,也就是3了.依次类推,下面我是摘自 
stackoverflow的解答,我们推得这个字符串的next[]为
# | String | P(#) | Longest matching prefix-suffix
0 | "a" | 0 | ""
1 | "ab" | 0 | ""
2 | "aba" | 1 | "a" -- a b a
3 | "abab" | 2 | "ab" -- ab ab
4 | "ababa" | 3 | "aba" -- ab a ba
5 | "ababac"| 0 | ""
6 |"ababaca"| 1 | "a" -- a babac a

    我们将next数组计算出来以后,其余的就好说了,在匹配的时候,总的思想还是kmp数组的算法思想.

即便说到这,当时我还是死活看不懂,用手找个例子运行一下.

--------------------------------------------------------------------------------------------------------------------------------

hdu 1711只是适合这个思想,题目稍微简单,哎,做个字符串的题目真是难受,就是简简单单的字符串输入输出就搞得头大,看来得花费一定的时间将它处理好.

总共提交了4次,通过这次我有点理解为什么zoj上的那道题不对了,不要用大数组作为函数的参数,虽然我现在讲不出理由,但直观的想想,即使传址来回跑多累,

#include
#include
using namespace std;
int text[1000010];
int pattern[10010];
int n,m;
int next[10010];
void getnext()
{
int k=0;
next[0]=0;
int i;
for(i=1;i {
while(k>0 && pattern[k] != pattern[i])
{
k=next[k-1];//k就是前缀后缀最长的数目
}
if(pattern[i]==pattern[k])
{
k++;
}
next[i]=k;
}
}
int kmp()
{
int i,q;
getnext();
q=0;
for(i=0;i {
while(q>0 && pattern[q] != text[i])
q=next[q-1];
if(pattern[q] == text[i])
{
q++;
}
if(q == m)
{
return i-m+2;
break;
}
}
return -1;
}
int main()
{
// freopen("in.txt","r",stdin);
int i;
int kcase;

scanf("%d",&kcase);
while(kcase--)
{
scanf("%d%d",&n,&m);
for(i=0;i scanf("%d",&text[i]);
for(i=0;i scanf("%d",&pattern[i]);
if(n {
printf("-1\n");
continue;
}
getnext();
printf("%d\n",kmp());
}
}

kmp hdu-1711,布布扣,bubuko.com


推荐阅读
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • 在 LeetCode 的“有效回文串 II”问题中,给定一个非空字符串 `s`,允许删除最多一个字符。本篇深入解析了如何判断删除一个字符后,字符串是否能成为回文串,并提出了高效的优化算法。通过详细的分析和代码实现,本文提供了多种解决方案,帮助读者更好地理解和应用这一算法。 ... [详细]
  • 装饰者模式(Decorator):一种灵活的对象结构设计模式
    装饰者模式(Decorator)是一种灵活的对象结构设计模式,旨在为单个对象动态地添加功能,而无需修改原有类的结构。通过封装对象并提供额外的行为,装饰者模式比传统的继承方式更加灵活和可扩展。例如,可以在运行时为特定对象添加边框或滚动条等特性,而不会影响其他对象。这种模式特别适用于需要在不同情况下动态组合功能的场景。 ... [详细]
  • VS2019 在创建 Windows 恢复点时出现卡顿问题及解决方法
    在使用 Visual Studio 2019 时,有时会在创建 Windows 恢复点时遇到卡顿问题。这可能是由于频繁的自动更新导致的,每次更新文件大小可能达到 1-2GB。尽管现代网络速度较快,但这些更新仍可能对系统性能产生影响。本文将探讨该问题的原因,并提供有效的解决方法,帮助用户提升开发效率。 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • 在最近的项目中,我们广泛使用了Qt框架的网络库,过程中遇到了一些挑战和问题。本文旨在记录这些经验和解决方案,以便日后参考。鉴于我们的客户端GUI完全基于Qt开发,我们期望利用其强大的网络功能进行Fiddler网络数据包的捕获与分析,以提升开发效率和应用性能。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • 在Conda环境中高效配置并安装PyTorch和TensorFlow GPU版的方法如下:首先,创建一个新的Conda环境以避免与基础环境发生冲突,例如使用 `conda create -n pytorch_gpu python=3.7` 命令。接着,激活该环境,确保所有依赖项都正确安装。此外,建议在安装过程中指定CUDA版本,以确保与GPU兼容性。通过这些步骤,可以确保PyTorch和TensorFlow GPU版的顺利安装和运行。 ... [详细]
  • 在跨线程调用UI控件方法时,通常使用同步调用机制,如 `控件.Invoke(Delegate, 参数)`。这里需要声明并实现一个委托,因为控件本身并不知道如何处理跨线程操作。通过将具体的实现逻辑封装在委托中,控件可以正确地执行这些操作,确保线程安全性和UI的一致性。此外,为了提高性能和可维护性,建议对频繁的跨线程调用进行优化,例如使用异步调用或批量处理请求。 ... [详细]
  • 近日,我在处理一个复杂的前端问题时遇到了极大困扰。具体来说,我之前开发了一个功能丰富的纯jQuery代码的前端GridView控件,实现了多种功能和视觉效果,并在多个项目中表现良好。然而,最近在尝试应用 `border-box` 布局模式时,却遇到了意想不到的兼容性和性能问题。这提醒我们在条件尚未完全成熟的情况下,应谨慎使用 `border-box` 布局模式,以免引入不必要的复杂性和潜在的bug。 ... [详细]
author-avatar
周白行_170
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有