hdu 4468 spy kmp+dp
来源:互联网 发布:休闲网游 知乎 编辑:程序博客网 时间:2024/04/27 16:40
首先可以用递推的思想来考虑,如果已经求得了dp[i]的答案,怎么得到dp[i+1]的答案。这个dp值是不考虑最后一个字符需要完整的。
只需要判断所有以i+1个字符为结尾的串中有没有一个是现在的模式串的前缀,有的话证明dp[i]的值就是dp[i+1]的值。
否则这个i+1号字符及它之前的还未匹配的串就一定要加入到模式串中。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=1e5+9;char a[maxn],ans[maxn];int next[maxn];int main(){ freopen("in.txt","r",stdin); int cas=0; while(scanf("%s",a+1)!=EOF) { memset(ans,0,sizeof(ans)); memset(next,0,sizeof(next)); int n=strlen(a+1),top=0,last=0,pre=0; for(int i=1,j;i<=n;i++) { j=pre; while(j&&(a[i]!=ans[j+1])) j=next[j]; if(a[i]!=ans[j+1]) { for(int k=last+1,t;k<=i;k++) { ans[++top]=a[k]; t=next[top-1]; while(t&&(a[k]!=ans[t+1])) t=next[t]; next[top]=t+(a[k]==ans[t+1]); if(top==1) next[top]=0; } last=i; int t=next[top-1]; while(t&&ans[top]!=ans[t]) t=next[t]; pre=t+(ans[top]==ans[t]); } else { pre=j+1; if(j+1==top) last=i; } } memset(a,0,sizeof(a)); printf("Case %d: %d\n",++cas,top+n-last); } return 0;}
- hdu 4468 spy kmp+dp
- hdu-4468-Spy-KMP+贪心
- HDOJ 4468 Spy KMP
- hdu 4468 spy(KMP应用,5级)
- HDU 4468 Spy && 动态KMP && 2012 Asia Chengdu Regional Contest
- poj 4468Spy(kmp算法)
- HDU 4274 spy work (树形DP)
- [hdu 4274]Spy's Work 树形dp
- HDU 4274 - Spy's Work(树形DP)
- HDU 4274-Spy's Work-树dp
- HDU 4468 Spy KMP + 贪心 (2012成都区域赛E题)
- HDU 3336 KMP+DP
- hdu 4552(KMP+DP)
- hdu 3336 KMP+DP
- HDU 5763 dp+kmp
- hdu 3336 Kmp+dp
- hdu 5763 kmp + dp
- hdu 5763(kmp + dp)
- VS2012:模块计算机类型“x64”与目标计算机类型“X86”冲突
- 刚学了函数..就要把开始的改编成函数形式的..到底什么是函数阿..?
- PMP考试需要知道的理念
- 复杂事件处理——Esper入门(示例程序)
- Sentence Created by Ubuntu
- hdu 4468 spy kmp+dp
- C# listview columnheader 右键事件
- eclipse项目名称更改,修改tomcat部署名称还是原来的项目名称的方法
- vb.net 常见时间类型问题
- 顺序表(学习笔记)
- 语言学基础 01
- Linux
- MySQL游标
- java7新特性--------final重抛