【练习03】 KMP 1006 Count the string
2013-06-21 21:00
246 查看
如果枚举所有前缀并且调用find函数会超时,但是我们思考一下就能发现只要遍历数组f,当f的值非0,count就加1(包括f
),最后加上字符串长度n就是最终的结果。(仔细理解)
最后还要注意的是题目要求输出mod 10007.
),最后加上字符串长度n就是最终的结果。(仔细理解)
最后还要注意的是题目要求输出mod 10007.
//模板开始 #include <string> #include <vector> #include <algorithm> #include <iostream> #include <sstream> #include <fstream> #include <map> #include <set> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include<iomanip> #include<string.h> #define SZ(x) (int(x.size())) using namespace std; int toInt(string s){ istringstream sin(s); int t; sin>>t; return t; } template<class T> string toString(T x){ ostringstream sout; sout<<x; return sout.str(); } typedef long long int64; int64 toInt64(string s){ istringstream sin(s); int64 t; sin>>t; return t; } template<class T> T gcd(T a, T b){ if(a<0) return gcd(-a, b); if(b<0) return gcd(a, -b); return (b == 0)? a : gcd(b, a % b); } //模板结束(通用部分) #define ifs cin void getFail(char* P, int* f) { int m = strlen(P); f[0] = 0; f[1] = 0; for(int i = 1; i < m; i++) { int j = f[i]; while(j && P[i] != P[j]) { j = f[j]; } f[i + 1]=P[i]==P[j]?j+1:0; } } int find(char* T, char*P, int*f) //KMP改进版本 { int count = 0; int n = strlen(T), m = strlen(P); getFail(P, f); int j = 0; for(int i = 0; i < n; i++) { while(j && P[j] != T[i]) { j = f[j]; } if(P[j] == T[i]) { j++; } if(j == m) //这里和常规的KMP不同 { count++; j = 0; continue; } } return count; } //【练习03】 KMP 1006 Count the string #define MAX_SIZE 200005 char P[MAX_SIZE]; int f[MAX_SIZE]; char T[MAX_SIZE]; int main() { //ifstream ifs("shuju.txt", ios::in); int cases; int n; static int count; ifs>>cases; for(int i = 0; i < cases; i++) { ifs>>n; ifs>>P; count = n; getFail(P, f); for(int j = 0; j <= n; j++) { if(f[j] != 0) { count++; } } cout<<count % 10007<<endl; } return 0; }
相关文章推荐
- HDU 3336 Count the string (KMP + DP)
- HDU 3336 Count the string / KMP
- HDU 3336 Count the string kmp+dp
- 【HDU 3336】Count the string(kmp)
- HDU 3336 Count the string(KMP)
- hdu 3336 Count the string -KMP&dp
- HDU3336-Count the string-KMP(next数组理解)
- hdu3336 Count the string 扩展KMP
- HDU 3336 Count the string(KMP 理解)
- hdu3336 Count the string KMP+dp
- [HDU 3336]Count the String[kmp][DP]
- HDU 3336 Count the string(KMP)
- hdu3336 Count the string(kmp+dp)
- hdu 3336 Count the string(扩展KMP模板)
- HDU 3336 Count the string(kmp数组)
- Hdu 3336 Count the string[KMP next数组的理解]
- HDU 3336 Count the string(kmp)
- hdu 3336 Count the string(KMP)
- 【HDU-3336-count the string】(KMP)
- HDU 3336 Count the string(KMP+稍微DP+next数组的运用)