hdu 3336 Count the string(KMP+dp)
2016-01-23 20:23
405 查看
题意:将字符串的每个前缀作为模式串,字符串作为主串,求模式串在主串中出现的次数和。
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define MAXN 200005//字符串长度 #define MOD 10007 char s[MAXN]; int dp[MAXN]; int _next[MAXN]; void GetNext(char t[]) //求next数组 { int j,k,len; j=0;//从0开始,首先求_next[1] k=-1;//比较指针 _next[0]=-1;//初始值-1 len=strlen(t); while(j<len) { if(k==-1||t[j]==t[k]) //指针到头了,或者相等 { ++j; ++k; _next[j]=k;//此句可由优化替代 /*优化(求匹配位置时可用) if(t[j]!=t[k])_next[j]=k; else _next[j]=_next[k]; //*/ } else k=_next[k]; } } int main() { int T; int n; int len; int ans; scanf("%d",&T); while(T--) { scanf("%d",&n); scanf("%s",s); GetNext(s); len=strlen(s); ans=0; dp[0]=0; for(int i=1; i<=len; ++i) //i表示以i结尾的前缀字符串 { dp[i]=dp[_next[i]]+1;//每个前缀增加个数1,dp[]为该前缀可以增加的个数 dp[i]%=MOD; ans+=dp[i]; ans%=MOD; } printf("%d\n",ans); } return 0; }
相关文章推荐
- Android源码剖析之-----Activity的启动过程
- android状态栏一体化(改变状态栏的背景颜色)类似于IOS
- jQuery.on() 函数详解
- I think I Need a Houseboat
- mysql分区查询
- 《穷人的小孩难成功-走出人生负面循环》视野的继承与影
- HDU 2601
- DoNet开源项目-基于jQuery EasyUI的后台管理系统
- Struts2_初见
- Form 提交表 单页面刷新不跳转
- Study Note: Logistic Regression(1)
- wait&while
- Study Note: Logistic Regression(1)
- Study Note: Logistic Regression(1)
- Study Note: Logistic Regression(1)
- Study Note: Logistic Regression(1)
- Study Note: Logistic Regression(1)
- java解析json字符串的两种方法详解(Android通用)
- codeforces 148D 概率DP
- mysql失效的几种情况