kmp hdu 3336 下标从1开始
来源:互联网 发布:文明mac版 编辑:程序博客网 时间:2024/04/23 18:50
kmp 模板
数组下标从1开始 P[1,2, . . . m] T[1,2 ,3 ... n]
void Prefix_Func() { int i,k; k=0; next[1]=0; for(i=2;i<=m;i++) { while(k>0 && P[k+1]!= P[i]) k=next[k]; if(P[k+1] == P[i]) k++; next[i]=k; } }
数组下标从0开始
void Prefix_Func() { int i,k; k=-1; next[0]=-1; for(i=1;i<m;i++) { while(k>=0 && P[k+1]!= P[i]) k=next[k]; if(P[k+1] == P[i]) k++; next[i]=k; } }
注意的地方:
a,表示从0开始 b, 表示从1开始
1, a, 初始 next[0] = -1
b, next[1] = 0
2, i 的取值范围
a, 一个是 [1------m-1 ]
b, 一个是 2--------m
3, while 循环终止条件
a, 一个是 k>=0
b, 一个是 k>0
hdu 3336 计算模板中前缀的个数
//设dp[i] :以string[i]结尾的字符字串的前缀总数
// 结论 : dp[j]= dp[i] +1 , 其中 next[j] = i
代码如下: 本题最好用下标从1开始
1 #include<iostream> 2 #include<stdio.h> 3 #include<string> 4 #include<string.h> 5 #define N 200005 6 using namespace std; 7 char P[N]; 8 int dp[N]; 9 int n,m;10 int next[N];11 void Prefix_Func()12 {13 int i,k;14 k=0;15 next[1]=0;16 for(i=2;i<=m;i++)17 {18 while(k>0 && P[k+1]!= P[i])19 k=next[k];20 if(P[k+1] == P[i])21 k++;22 next[i]=k;23 }24 }25 int main()26 {27 int t,sum;28 cin>>t;29 while(t--)30 {31 sum=0;32 cin>>m;33 scanf("%s",P+1);34 Prefix_Func();35 dp[0]=0;36 for(int i=1;i<=m;i++)37 dp[i]=dp[next[i]]+1;38 39 for(int i=1;i<=m;i++)40 {41 sum=(sum+dp[i])%10007;42 }43 cout<<sum<<endl;44 }45 return 0 ;46 }
0 0
- kmp hdu 3336 下标从1开始
- hdu 3746 kmp求循环节 下标从1开始
- poj 3080 get_next + kmp + 字符数组做函数参数 + 数组下标从1 开始
- PostgreSQL 里 下标从 1 开始
- 等比求和模版,下标从1开始
- matlab中的下标都是从1开始
- Kmp求next的值(下标从0开始的)
- leetcode oj 28 字符串匹配 kmp 下标从0开始 kuangbin模板
- 萌新的看毛片(kmp)学习日记(下标从0开始)
- 数组下标从0开始
- 程序风格---数组下标全部从1开始
- 编程之中,下标从1开始的情况
- 数组的下标从0开始
- 数组下标为什么要从0开始
- 数组下标为什么是从0开始?
- 返回所有匹配子串开始下标 KMP
- KMP 求next的值(下标从一开始的)
- Repeater控件获取标识号,下标从1,2,3,4,5,6...开始
- 新人报到
- hdu 1509 1873()病人要看病 优先队列(符号重载)
- hdu 1381 map(映射)
- hdu 1106 字符串处理
- 初识kmp hdu 1686
- kmp hdu 3336 下标从1开始
- hdu 3746 kmp求循环节 下标从1开始
- hdu 1358 kmp 求前缀有几个循环
- hdu kmp 2594
- dfs hdu 1241 寻找连通分量的个数
- zoj 2412 dfs 求连通分量的个数
- ACE_Message_Block(V4.0)
- zoj 2110 dfs+步长
- 九度OJ 1548 map的用法