|
#ifndef RUNN_H |
|
#define RUNN_H |
|
|
|
#include <fstream> |
|
#include <iostream> |
|
#include <cctype> |
|
#include <cstring> |
|
#include <cstdlib> |
|
using namespace std; |
|
namespace iret { |
|
|
|
const int word_cnt = 5000; |
|
const int word_len = 1500; |
|
const long max_str=1500; |
|
|
|
int get_pathw(char *cn,const char *dfl,const char *dex,const char *a); |
|
|
|
|
|
|
|
char *add_num(const char *ptr,long n,char *buf); |
|
|
|
|
|
|
|
|
|
int get_qflag(); |
|
|
|
|
|
int mark(int,long,int,const char*); |
|
|
|
|
|
|
|
long gseed(int,char**,const char*); |
|
|
|
|
|
|
|
|
|
|
|
|
|
long clnga(int,char**,const char*,const char*); |
|
|
|
|
|
|
|
|
|
|
|
double cdbla(int,char**,const char*,const char*); |
|
char *cstra(int,char**,const char*,const char*); |
|
long zrand(long); |
|
|
|
|
|
void shuffle(long n,long *idx); |
|
void dshuffle(long n,long *idx); |
|
|
|
long rnd(double); |
|
|
|
|
|
|
|
|
|
inline int get_string(char *cnam,ifstream &ifile,char a){ |
|
char *pch = cnam; |
|
long j=1; |
|
|
|
start: |
|
if((*(pch++)=ifile.get())!=EOF){ |
|
if(*(pch-1)==a){pch--;goto start;} |
|
while(((*(pch++)=ifile.get())!=a)&&(j<max_str))j++; |
|
if(j<max_str){ |
|
*(--pch)='\0'; |
|
return(j); |
|
} |
|
else return(0); |
|
} |
|
return(0); |
|
} |
|
|
|
inline int get_strinf(char *cnam,fstream &ifile,char a){ |
|
char *pch = cnam; |
|
long j=1; |
|
if((*(pch++)=ifile.get())!=EOF){ |
|
while(((*(pch++)=ifile.get())!=a)&&(j<max_str))j++; |
|
if(j<max_str){ |
|
*(--pch)='\0'; |
|
return(j); |
|
} |
|
else return(0); |
|
} |
|
return(0); |
|
} |
|
|
|
|
|
inline void lower_case(char *cnam){ |
|
int i=0; |
|
char ch; |
|
|
|
while((ch=cnam[i])!='\0'){ |
|
cnam[i++]=tolower(ch); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <class X> |
|
void sSort(const long ix, X *idx){ |
|
long k, j, ir, i; |
|
X rra; |
|
|
|
if(ix<=1)return; |
|
|
|
k=(ix>>1); |
|
ir=ix-1; |
|
for(;;) { |
|
if(k>0) { |
|
rra=idx[--k]; |
|
} |
|
else { |
|
rra=idx[ir]; |
|
idx[ir] = idx[0]; |
|
if(--ir ==0) { |
|
idx[0]=rra; |
|
return; |
|
} |
|
} |
|
i=k; |
|
j=((k+1)<<1)-1; |
|
while(j<=ir) { |
|
if(j<ir && (idx[j]<idx[j+1])) ++j; |
|
if(rra<idx[j]) { |
|
idx[i]=idx[j]; |
|
j +=(i=j)+1; |
|
} |
|
else j=ir+1; |
|
} |
|
idx[i]=rra; |
|
} |
|
} |
|
|
|
template <class X> |
|
void sRort(const long ix, X *idx){ |
|
long k, j, ir, i; |
|
X rra; |
|
|
|
if(ix<=1)return; |
|
|
|
k=(ix>>1); |
|
ir=ix-1; |
|
for(;;) { |
|
if(k>0) { |
|
rra=idx[--k]; |
|
} |
|
else { |
|
rra=idx[ir]; |
|
idx[ir] = idx[0]; |
|
if(--ir ==0) { |
|
idx[0]=rra; |
|
return; |
|
} |
|
} |
|
i=k; |
|
j=((k+1)<<1)-1; |
|
while(j<=ir) { |
|
if(j<ir && (idx[j]>idx[j+1])) ++j; |
|
if(rra>idx[j]) { |
|
idx[i]=idx[j]; |
|
j +=(i=j)+1; |
|
} |
|
else j=ir+1; |
|
} |
|
idx[i]=rra; |
|
} |
|
} |
|
|
|
template <class X, class Y> |
|
void hSort(const long n, X *ra, Y *rb) { |
|
long k, j, ir, i; |
|
X rra; |
|
Y rrb; |
|
|
|
if(n<=1)return; |
|
|
|
k=(n>>1); |
|
ir=n-1; |
|
for(;;) { |
|
if(k>0) { |
|
rra=ra[--k]; |
|
rrb=rb[k]; |
|
} |
|
else { |
|
rra=ra[ir]; |
|
rrb=rb[ir]; |
|
ra[ir] = ra[0]; |
|
rb[ir] = rb[0]; |
|
if(--ir ==0) { |
|
ra[0]=rra; |
|
rb[0]=rrb; |
|
return; |
|
} |
|
} |
|
i=k; |
|
j=((k+1)<<1)-1; |
|
while(j<=ir) { |
|
if(j<ir && ra[j] < ra[j+1]) ++j; |
|
if(rra<ra[j]) { |
|
ra[i]=ra[j]; |
|
rb[i]=rb[j]; |
|
j +=(i=j)+1; |
|
} |
|
else j=ir+1; |
|
} |
|
ra[i]=rra; |
|
rb[i]=rrb; |
|
} |
|
} |
|
|
|
template <class X, class Y, class Z> |
|
void hSort(const long n, X *ra, Y *rb, Z *rc) { |
|
long k, j, ir, i; |
|
X rra; |
|
Y rrb; |
|
Z rrc; |
|
|
|
if(n<=1)return; |
|
|
|
k=(n>>1); |
|
ir=n-1; |
|
for(;;) { |
|
if(k>0) { |
|
rra=ra[--k]; |
|
rrb=rb[k]; |
|
rrc=rc[k]; |
|
} |
|
else { |
|
rra=ra[ir]; |
|
rrb=rb[ir]; |
|
rrc=rc[ir]; |
|
ra[ir] = ra[0]; |
|
rb[ir] = rb[0]; |
|
rc[ir] = rc[0]; |
|
if(--ir ==0) { |
|
ra[0]=rra; |
|
rb[0]=rrb; |
|
rc[0]=rrc; |
|
return; |
|
} |
|
} |
|
i=k; |
|
j=((k+1)<<1)-1; |
|
while(j<=ir) { |
|
if(j<ir && ra[j] < ra[j+1]) ++j; |
|
if(rra<ra[j]) { |
|
ra[i]=ra[j]; |
|
rb[i]=rb[j]; |
|
rc[i]=rc[j]; |
|
j +=(i=j)+1; |
|
} |
|
else j=ir+1; |
|
} |
|
ra[i]=rra; |
|
rb[i]=rrb; |
|
rc[i]=rrc; |
|
} |
|
} |
|
|
|
template <class X, class Y> |
|
void hRort(const long n, X *ra, Y *rb) { |
|
long k, j, ir, i; |
|
X rra; |
|
Y rrb; |
|
|
|
if(n<=1)return; |
|
|
|
k=(n>>1); |
|
ir=n-1; |
|
for(;;) { |
|
if(k>0) { |
|
rra=ra[--k]; |
|
rrb=rb[k]; |
|
} |
|
else { |
|
rra=ra[ir]; |
|
rrb=rb[ir]; |
|
ra[ir] = ra[0]; |
|
rb[ir] = rb[0]; |
|
if(--ir ==0) { |
|
ra[0]=rra; |
|
rb[0]=rrb; |
|
return; |
|
} |
|
} |
|
i=k; |
|
j=((k+1)<<1)-1; |
|
while(j<=ir) { |
|
if(j<ir && ra[j] > ra[j+1]) ++j; |
|
if(rra>ra[j]) { |
|
ra[i]=ra[j]; |
|
rb[i]=rb[j]; |
|
j +=(i=j)+1; |
|
} |
|
else j=ir+1; |
|
} |
|
ra[i]=rra; |
|
rb[i]=rrb; |
|
} |
|
} |
|
|
|
template <class X, class Y, class Z> |
|
void hRort(const long n, X *ra, Y *rb, Z *rc) { |
|
long k, j, ir, i; |
|
X rra; |
|
Y rrb; |
|
Z rrc; |
|
|
|
if(n<=1)return; |
|
|
|
k=(n>>1); |
|
ir=n-1; |
|
for(;;) { |
|
if(k>0) { |
|
rra=ra[--k]; |
|
rrb=rb[k]; |
|
rrc=rc[k]; |
|
} |
|
else { |
|
rra=ra[ir]; |
|
rrb=rb[ir]; |
|
rrc=rc[ir]; |
|
ra[ir] = ra[0]; |
|
rb[ir] = rb[0]; |
|
rc[ir] = rc[0]; |
|
if(--ir ==0) { |
|
ra[0]=rra; |
|
rb[0]=rrb; |
|
rc[0]=rrc; |
|
return; |
|
} |
|
} |
|
i=k; |
|
j=((k+1)<<1)-1; |
|
while(j<=ir) { |
|
if(j<ir && ra[j] > ra[j+1]) ++j; |
|
if(rra>ra[j]) { |
|
ra[i]=ra[j]; |
|
rb[i]=rb[j]; |
|
rc[i]=rc[j]; |
|
j +=(i=j)+1; |
|
} |
|
else j=ir+1; |
|
} |
|
ra[i]=rra; |
|
rb[i]=rrb; |
|
rc[i]=rrc; |
|
} |
|
} |
|
|
|
|
|
|
|
void long_str(char *cnam,long n); |
|
|
|
|
|
|
|
void str_long(char *cnam,long &n); |
|
|
|
|
|
|
|
int trac(const char *str); |
|
|
|
template<typename Y,typename Z> |
|
void xshuffle(Y n,Z *idx){ |
|
Y i,k; |
|
Z u; |
|
for(i=n-1;i>0;i--){ |
|
k=(Y)zrand((long)i+1); |
|
u=idx[i]; |
|
idx[i]=idx[k]; |
|
idx[k]=u; |
|
} |
|
} |
|
|
|
template<class Z> |
|
void dxhuffle(long n,Z *idx){ |
|
long i,k; |
|
Z xx; |
|
for(i=n-1;i>0;i--){ |
|
k=zrand(i+1); |
|
xx=idx[i]; |
|
idx[i]=idx[k]; |
|
idx[k]=xx; |
|
} |
|
} |
|
|
|
} |
|
#endif |
|
|