BNU 27542 (LA 4875)Just The Simple Fax
大模拟,不再详述,但是此题的输入还是有技巧的,可以借鉴。直接上代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <vector>
#define mem(a , b) memset(a , b , sizeof(a))
#define MAX 1000
#define INF 1e8
using namespace std ;
const int HU = 80 ;
const int MAXN = 10005 ;
int pan1 = 1 << 3 ;
int b0 = 7 ;
char s[MAXN] ;
char ans[MAXN] ;
int t[MAXN] ;
int ca ;
int B ;
int n ;
int k ;
int len ;
int cnt ;
char tmp[MAXN] ;
char zf(int x)
{
if(x >= 10)
return 'A' + x - 10 ;
return '0' + x ;
}
void init() // 输入
{
int i ;
for(i = 0 ; i < n ; i ++)
{
scanf("%s" , s + i * 80) ; // 技巧性
}
}
void prechu()
{
len = strlen(s) ;
int i ;
for(i = 0 ; i < len ;)
{
int st = i ;
int e = i ;
char a , b ;
a = s[st] ;
b = s[st + 1] ;
int sum = 0 ;
while (1)
{
if(e < len && s[e] == a && s[e + 1] == b)
{
sum ++ ;
e += 2 ;
}
else
break ;
}
int j ;
for(j = st ; j < e ; j ++)
{
t[j] = sum ;
}
i = e ;
}
}
void midchu()
{
int i ;
int k ;
for(i = 0 ; i < len ;)
{
k = 0 ;
int st = i ;
int e = i ;
char a , b ;
a = s[st] ;
b = s[st + 1] ;
if(t[e] <= 2)
{
while (e < len && t[e] <= 2)
{
if(k == 128)
{
break ;
}
k ++ ;
e += 2 ;
}
int tg = k - 1 ;
tg = k - 1 ;
tg = tg >> 4 ;
ans[cnt ++] = zf(tg) ;
tg = k - 1 ;
tg = tg & 15 ;
ans[cnt ++] = zf(tg) ;
for(int tk = st ; tk < e ;)
{
ans[cnt ++] = s[tk ++] ;
}
i = e ;
}
else
{
while (e < len && s[e] == a && s[e + 1] == b)
{
if(k == 130)
{
break ;
}
k ++ ;
e += 2 ;
}
if(k >= 3)
{
k -= 3 ;
int tg = k ;
tg = tg | (1 << 7) ;
int tg1 = tg >> 4 ;
ans[cnt ++] = zf(tg1) ;
tg1 = tg & 15 ;
ans[cnt ++] = zf(tg1) ;
ans[cnt ++] = a ;
ans[cnt ++] = b ;
}
else
{
int tg = k - 1 ;
tg = k - 1 ;
tg = tg >> 4 ;
ans[cnt ++] = zf(tg) ;
tg = k - 1 ;
tg = tg & 15 ;
ans[cnt ++] = zf(tg) ;
for(int tk = 0 ; tk < k ; tk ++)
{
ans[cnt ++] = a ;
ans[cnt ++] = b ;
}
}
i = e ;
}
}
}
void solve()
{
prechu() ;
midchu() ;
printf("%d %d\n" , ca , cnt / 2) ;
int i ;
for(i = 0 ; i < cnt ; i ++)
{
if(i % HU == 0 && i > 0) puts("") ;
printf("%c" , ans[i]) ;
}
puts("") ;
}
int main()
{
int T ;
scanf("%d" , &T) ;
while (T --)
{
scanf("%d%d" , &ca , &B) ;
B += B ;
cnt = 0 ;
n = B / HU ;
if(B % HU != 0)
n ++ ;
init() ;
solve() ;
}
return 0;
}
LA 4876 Show Me The Fax (和上题互为逆过程,不过此题较简单)
直接上代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <vector>
#define mem(a , b) memset(a , b , sizeof(a))
#define MAX 1000
#define INF 1e8
using namespace std ;
const int HU = 80 ;
const int MAXN = 10005 ;
int pan1 = 1 << 3 ;
int b0 = 7 ;
char s[MAXN] ;
char ans[MAXN] ;
int ca ;
int B ;
int n ;
int k ;
int len ;
int cnt ;
int isUp(char x)
{
if(x >= 'A' && x <= 'Z')
return 1 ;
return 0 ;
}
void init()
{
int i ;
for(i = 0 ; i < n ; i ++)
{
scanf("%s" , s + i * 80) ;
}
}
void solve()
{
len = strlen(s) ;
int i , j ;
for(j = 0 ; j < len ;)
{
int a , b ;
if(isUp(s[j]))
{
a = s[j] - 'A' + 10 ;
}
else
{
a = s[j] - '0' ;
}
j ++ ;
if(isUp(s[j]))
{
b = s[j] - 'A' + 10 ;
}
else
{
b = s[j] - '0' ;
}
int ts = 0 ;
if(a & pan1)
{
a &= b0 ;
a = a << 4 ;
ts = a + b ;
ts += 3 ;
for(k = 0 ; k < ts ; k ++)
{
ans[cnt ++ ] = s[j + 1] ;
ans[cnt ++ ] = s[j + 2] ;
}
j += 3 ;
}
else
{
a = a << 4 ;
ts = a + b ;
ts ++ ;
for(k = 0 ; k < ts ; k ++)
{
j ++ ;
ans[cnt ++ ] = s[j] ;
j ++ ;
ans[cnt ++ ] = s[j] ;
}
j ++ ;
}
}
printf("%d %d\n" , ca , cnt / 2) ;
for(i = 0 ; i < cnt ; i ++)
{
if(i % HU == 0 && i > 0) puts("") ;
printf("%c" , ans[i]) ;
}
puts("") ;
}
int main()
{
int T ;
scanf("%d" , &T) ;
while (T --)
{
scanf("%d%d" , &ca , &B) ;
B += B ;
cnt = 0 ;
n = B / HU ;
if(B % HU != 0)
n ++ ;
init() ;
solve() ;
}
return 0;
}