//algorytm KMP pochodzi z "algorytmiki praktycznej" Piotra Stanczyka #include "message.h" #include "poszukiwania.h" #include <cstdio> //#include <iostream> #include <algorithm> #include <string> #include <vector> using namespace std; typedef vector<int> VI; typedef long long LL; typedef vector<VI> VVI; typedef vector<LL> VLL; typedef vector<double> VD; //typedef vector<string> VS; typedef pair<int, int> PII; typedef vector<PII> VPII; #define PF push_front #define MP make_pair #define FOR(x, b, e) for(int x = b; x <= (e); ++x) #define FORD(x, b, e) for(int x = b; x >= (e); --x) #define REP(x, n) for(int x = 0; x < (n); ++x) #define VAR(v, n) typeof(n) v = (n) #define ALL(c) (c).begin(), (c).end() #define SIZE(x) ((int)(x).size()) #define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define PB push_back #define ST first #define ND second void KMP(const VI& str,const VI& wzo) { #define KMPH(z) while(k > 0 && wzo[k] != z[q]) k = p[k]; if(wzo[k] == z[q]) k++; int k = 0, q, m,l=0; VI p(wzo.size()+1); p[1] = 0; for (q = 1; q<SIZE(wzo); q++) { KMPH(wzo); p[q + 1] = k; } m = q; k = 0; for (q = 0; q<SIZE(str); q++) { KMPH(str); if(m == k) { ++l; k = p[k]; } } printf("%d",l); return; } int main() { int i; if(MyNodeId()) return 0; int cl=SeqLength(),sl=SignalLength(); VI str(cl),wzo(sl); for(i=0;i<cl;++i) str[i]=SeqAt(i+1); for(i=0;i<sl;++i) wzo[i]=SignalAt(i+1); KMP(str,wzo); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | //algorytm KMP pochodzi z "algorytmiki praktycznej" Piotra Stanczyka #include "message.h" #include "poszukiwania.h" #include <cstdio> //#include <iostream> #include <algorithm> #include <string> #include <vector> using namespace std; typedef vector<int> VI; typedef long long LL; typedef vector<VI> VVI; typedef vector<LL> VLL; typedef vector<double> VD; //typedef vector<string> VS; typedef pair<int, int> PII; typedef vector<PII> VPII; #define PF push_front #define MP make_pair #define FOR(x, b, e) for(int x = b; x <= (e); ++x) #define FORD(x, b, e) for(int x = b; x >= (e); --x) #define REP(x, n) for(int x = 0; x < (n); ++x) #define VAR(v, n) typeof(n) v = (n) #define ALL(c) (c).begin(), (c).end() #define SIZE(x) ((int)(x).size()) #define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define PB push_back #define ST first #define ND second void KMP(const VI& str,const VI& wzo) { #define KMPH(z) while(k > 0 && wzo[k] != z[q]) k = p[k]; if(wzo[k] == z[q]) k++; int k = 0, q, m,l=0; VI p(wzo.size()+1); p[1] = 0; for (q = 1; q<SIZE(wzo); q++) { KMPH(wzo); p[q + 1] = k; } m = q; k = 0; for (q = 0; q<SIZE(str); q++) { KMPH(str); if(m == k) { ++l; k = p[k]; } } printf("%d",l); return; } int main() { int i; if(MyNodeId()) return 0; int cl=SeqLength(),sl=SignalLength(); VI str(cl),wzo(sl); for(i=0;i<cl;++i) str[i]=SeqAt(i+1); for(i=0;i<sl;++i) wzo[i]=SignalAt(i+1); KMP(str,wzo); return 0; } |