#include <algorithm>
#include <string>
#include <message.h>
#include <vector>
#include <cstdio>
#include <cstring>
//#include "log.h"
//using logging::info;
#define REP(i,n) for(int i=0; i<(n); ++i)
#define FOR(i,p,k) for(int i=(p); i<=(k); ++i)
template<typename T> inline void checkmin(T &a, T b){ if(b<a) a = b; }
template<typename T> inline void checkmax(T &a, T b){ if(a<b) a = b; }
enum { n_max = 110000, msg = 980, chunk = n_max/msg };
struct Val
{
int d,x;
Val operator+(int v) const { return Val{d+v,x}; }
Val chg(char a, char b) const
{ return a==b ? *this : Val{d+1,x+(a<b)}; }
bool operator<(const Val &b) const { return d!=b.d?d<b.d:x<b.x; }
};
char a[n_max],b[n_max];
Val D[2][n_max];
int main()
{
int asize,bsize;
scanf("%d%d %s %s",&asize,&bsize,a,b);
int N = NumberOfNodes();
int I = MyNodeId();
int b0 = I*bsize/N;
int b1 = (I+1)*bsize/N;
int bs = b1-b0+1;
REP(i,bs) D[0][i] = Val{b0+i,0};
bool cur = 1;
//info("range [%;%]",b0,b1);
REP(ai,asize)
{
if(I)
{
if(!(ai%chunk)) Receive(I-1);
D[cur][0].d = GetInt(I-1);
D[cur][0].x = GetInt(I-1);
} else D[cur][0] = Val{ai+1,0};
FOR(i,1,bs-1)
{
D[cur][i] = std::min(D[!cur][i],D[cur][i-1])+1;
checkmin(D[cur][i],D[!cur][i-1].chg(a[ai],b[b0+i-1]));
}
if(I<N-1)
{
PutInt(I+1,D[cur][bs-1].d);
PutInt(I+1,D[cur][bs-1].x);
if(!((ai+1)%chunk) || ai==asize-1) Send(I+1);
}
cur = !cur;
}
if(I==N-1) printf("%d %d\n",D[!cur][bs-1].d,D[!cur][bs-1].x);
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 | #include <algorithm> #include <string> #include <message.h> #include <vector> #include <cstdio> #include <cstring> //#include "log.h" //using logging::info; #define REP(i,n) for(int i=0; i<(n); ++i) #define FOR(i,p,k) for(int i=(p); i<=(k); ++i) template<typename T> inline void checkmin(T &a, T b){ if(b<a) a = b; } template<typename T> inline void checkmax(T &a, T b){ if(a<b) a = b; } enum { n_max = 110000, msg = 980, chunk = n_max/msg }; struct Val { int d,x; Val operator+(int v) const { return Val{d+v,x}; } Val chg(char a, char b) const { return a==b ? *this : Val{d+1,x+(a<b)}; } bool operator<(const Val &b) const { return d!=b.d?d<b.d:x<b.x; } }; char a[n_max],b[n_max]; Val D[2][n_max]; int main() { int asize,bsize; scanf("%d%d %s %s",&asize,&bsize,a,b); int N = NumberOfNodes(); int I = MyNodeId(); int b0 = I*bsize/N; int b1 = (I+1)*bsize/N; int bs = b1-b0+1; REP(i,bs) D[0][i] = Val{b0+i,0}; bool cur = 1; //info("range [%;%]",b0,b1); REP(ai,asize) { if(I) { if(!(ai%chunk)) Receive(I-1); D[cur][0].d = GetInt(I-1); D[cur][0].x = GetInt(I-1); } else D[cur][0] = Val{ai+1,0}; FOR(i,1,bs-1) { D[cur][i] = std::min(D[!cur][i],D[cur][i-1])+1; checkmin(D[cur][i],D[!cur][i-1].chg(a[ai],b[b0+i-1])); } if(I<N-1) { PutInt(I+1,D[cur][bs-1].d); PutInt(I+1,D[cur][bs-1].x); if(!((ai+1)%chunk) || ai==asize-1) Send(I+1); } cur = !cur; } if(I==N-1) printf("%d %d\n",D[!cur][bs-1].d,D[!cur][bs-1].x); return 0; } |
English