Hdu 3336 kmp+dp解题报告
2012-09-01 21:42
369 查看
长话短说,题目的意思很明确,就是让给你一个字符串,然后计算不断增加的前缀字符串在整个字符创当中出现的次数,可能出现的次数过大,所以要求结果%10007.
Kmp算法,相信正在做此题的人应该都会对这个有所了解,对于整个字符串做一个预处理,生成一个next的数组,其中的内部数据
next[i]=j就表示在前i个字符串当中,从前1到j的j长度字符字串和i-j+1到i的j长度的字符字串相等。
那么举一个例子就可以知道:
ababab
001234
那么接下来就是关于dp的状态方程的理解了
dp[i]=dp[next[i]]+1;
具体意思就是说利用next数据跳转到第next[i]的位置,这个位置的跟之前的有过多少次匹配,只要在原基础上加1即可。
View Code
Kmp算法,相信正在做此题的人应该都会对这个有所了解,对于整个字符串做一个预处理,生成一个next的数组,其中的内部数据
next[i]=j就表示在前i个字符串当中,从前1到j的j长度字符字串和i-j+1到i的j长度的字符字串相等。
那么举一个例子就可以知道:
ababab
001234
那么接下来就是关于dp的状态方程的理解了
dp[i]=dp[next[i]]+1;
具体意思就是说利用next数据跳转到第next[i]的位置,这个位置的跟之前的有过多少次匹配,只要在原基础上加1即可。
View Code
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int t,len,flag; scanf("%d",&t); char temp[202000]; int next[202000],dp[202000]; while(t--) { scanf("%d",&len); getchar(); gets(temp+1); next[1]=0; flag=0; for(int i=2;i<=len;i++)//构造预处理的next数组 { while(flag>0&&temp[flag+1]!=temp[i]) flag=next[flag]; if(temp[flag+1]==temp[i]) flag++; next[i]=flag; } memset(dp,0,sizeof(dp)); int total=0; for(int i=1;i<=len;i++) { dp[i]=dp[next[i]]+1; total=(total+dp[i])%10007; } printf("%d\n",total); } return 0; }
相关文章推荐
- Monkey and Banana(HDU 1069)解题报告(DP - 滚动数组)
- hdu 3336 kmp+dp
- hdu 5375 - Gray code(dp) 解题报告
- HDU 2089 解题报告 数位DP
- 最大报销额 (HDU 1864)解题报告(DP - 01 - 背包)
- HDU 1964 Pipes 解题报告(插头DP)
- hdu 2242 考研路茫茫——空调教室 【Tarjan缩点+树上DP】 解题报告
- HDU - 5918 Sequence I解题报告(KMP)
- HDU 3336 Count the string(KMP+DP)
- HDU 3336 Count the string kmp+dp
- hdu 5375 - Gray code(dp) 解题报告
- 【解题报告】HDU 4679 Terrorist’s destroy -- 树形dp 删一边求两子树直径
- HDU 3336 Count the string (KMP + DP)
- Hdu-3336 Count the string(KMP + DP)
- HDU 3336 Count the string(kmp + dp)
- HDU 4582 DFS spanning tree 解题报告(贪心 & 树形DP)
- 【解题报告】HDU 4616 Game - 树形dp
- HDU 3336 Count the string (kmp+dp)
- HDU 3336 Count the string(kmp+dp)
- hdu 3336 KMP+DP