#include<cstdio> #include<vector> using namespace std; #include "message.h" #include "poszukiwania.h" const int MAXN = 1e6+4; long long m, s; long long CharAt(long long x) { // printf("x %lld\n", x); if (x <= s) return SignalAt(x); if (x == s+1) return -111; if (x <= s+m+1) return SeqAt(x - s-1); else return -234; } int main (){ s = SignalLength(); m = SeqLength(); if(MyNodeId() == 0){ vector<int> w; w.clear(); w.push_back(0); w.push_back(0); long long k = 0, tomek = 0; long long prt; for (int i = 2; i < m+s+1; i++) { prt = CharAt(i); // printf("%d ", prt); while(k > 0 && CharAt(k+1) != prt) k = w[k]; if(CharAt(k+1) == prt) k++; if (i <= s+1) w.push_back(k); // printf("%d: %d %d prt %d\n", i, k, w[i], prt); if (k == s) tomek++; } printf("%lld\n", tomek);} 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 | #include<cstdio> #include<vector> using namespace std; #include "message.h" #include "poszukiwania.h" const int MAXN = 1e6+4; long long m, s; long long CharAt(long long x) { // printf("x %lld\n", x); if (x <= s) return SignalAt(x); if (x == s+1) return -111; if (x <= s+m+1) return SeqAt(x - s-1); else return -234; } int main (){ s = SignalLength(); m = SeqLength(); if(MyNodeId() == 0){ vector<int> w; w.clear(); w.push_back(0); w.push_back(0); long long k = 0, tomek = 0; long long prt; for (int i = 2; i < m+s+1; i++) { prt = CharAt(i); // printf("%d ", prt); while(k > 0 && CharAt(k+1) != prt) k = w[k]; if(CharAt(k+1) == prt) k++; if (i <= s+1) w.push_back(k); // printf("%d: %d %d prt %d\n", i, k, w[i], prt); if (k == s) tomek++; } printf("%lld\n", tomek);} return 0; } |