#include <stdio.h> #include <iostream> #include <assert.h> #include <vector> #include "message.h" #include "poszukiwania.h" using namespace std; long long result = 0; long long KMP() { vector<unsigned int> T(SignalLength() + 1, -1); // vector<unsigned int> T(30000000, -1); for(int i = 1; i <= SignalLength(); i++) { int pos = T[i - 1]; while(pos != -1 && SignalAt(pos+1) != SignalAt(i - 1+1)) pos = T[pos]; T[i] = pos + 1; } int sp = 0, kp = 0; while(sp < SeqLength()) { while(kp != -1 && (kp == SignalLength() || SignalAt(kp+1) != SeqAt(sp+1))) kp = T[kp]; kp++; sp++; if(kp == SignalLength()) result++; } return result; } unsigned int YAdapt(unsigned int pos) //smaler { return SeqAt(pos+1); } unsigned int XAdapt(unsigned int pos) { return SignalAt(pos+1); } #define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b)) //y bigger n-size //x smalle m-size // x -> XAdapt // y -> Yadapt long long KR() { int d, hx, hy, i, j; int m = SignalLength();//mniejszy int n = SeqLength(); //wiekszy result=0; /* Preprocessing */ /* computes d = 2^(m-1) with the left-shift operator */ for (d = i = 1; i < m; ++i) d = (d<<1); for (hy = hx = i = 0; i < m; ++i) { // hx = ((hx<<1) + x[i]); // hy = ((hy<<1) + y[i]); hx = ((hx<<1) + XAdapt(i)); hy = ((hy<<1) + YAdapt(i)); } /* Searching */ j = 0; while (j < n-m) { if (hx == hy) { int jp; for (jp = 0; jp < m; jp++) { if (YAdapt(j + jp) != XAdapt(jp)) break; } if (jp == m) { result++; } } hy = REHASH(YAdapt(j), YAdapt(j + m), hy); ++j; } return result; } int main() { if (MyNodeId() == 0) { int sl = SignalLength(); if (sl< 30000001) cout << KMP() << endl; else cout << KR() << endl; } 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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <stdio.h> #include <iostream> #include <assert.h> #include <vector> #include "message.h" #include "poszukiwania.h" using namespace std; long long result = 0; long long KMP() { vector<unsigned int> T(SignalLength() + 1, -1); // vector<unsigned int> T(30000000, -1); for(int i = 1; i <= SignalLength(); i++) { int pos = T[i - 1]; while(pos != -1 && SignalAt(pos+1) != SignalAt(i - 1+1)) pos = T[pos]; T[i] = pos + 1; } int sp = 0, kp = 0; while(sp < SeqLength()) { while(kp != -1 && (kp == SignalLength() || SignalAt(kp+1) != SeqAt(sp+1))) kp = T[kp]; kp++; sp++; if(kp == SignalLength()) result++; } return result; } unsigned int YAdapt(unsigned int pos) //smaler { return SeqAt(pos+1); } unsigned int XAdapt(unsigned int pos) { return SignalAt(pos+1); } #define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b)) //y bigger n-size //x smalle m-size // x -> XAdapt // y -> Yadapt long long KR() { int d, hx, hy, i, j; int m = SignalLength();//mniejszy int n = SeqLength(); //wiekszy result=0; /* Preprocessing */ /* computes d = 2^(m-1) with the left-shift operator */ for (d = i = 1; i < m; ++i) d = (d<<1); for (hy = hx = i = 0; i < m; ++i) { // hx = ((hx<<1) + x[i]); // hy = ((hy<<1) + y[i]); hx = ((hx<<1) + XAdapt(i)); hy = ((hy<<1) + YAdapt(i)); } /* Searching */ j = 0; while (j < n-m) { if (hx == hy) { int jp; for (jp = 0; jp < m; jp++) { if (YAdapt(j + jp) != XAdapt(jp)) break; } if (jp == m) { result++; } } hy = REHASH(YAdapt(j), YAdapt(j + m), hy); ++j; } return result; } int main() { if (MyNodeId() == 0) { int sl = SignalLength(); if (sl< 30000001) cout << KMP() << endl; else cout << KR() << endl; } return 0; } |