| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
WA实在找不出哪里错了 ~~堆 大家帮我找找吧#include "iostream"
#include "string.h"
char str[1000100];
long heap[1000100][2];
long size;
using namespace std;
inline void swap(long A[][2],int x, int y){
int t;
t=A[x][0], A[x][0]=A[y][0], A[y][0]=t;
t=A[x][1], A[x][1]=A[y][1], A[y][1]=t;
}
void heap_increase_key(long A[][2],int i,long key) {
A[i][0]=key;
while(i>1 && (
A[i/2][0]<A[i][0] ||
(A[i/2][0]==A[i][0] && A[i/2][1]>A[i][1]))
){
swap(A,i,i/2);
i=i/2;
}
}
void max_heapify(long A[][2],long n, int i) {//a[1]--a[n]
int l=i*2;
int r=i*2+1;
long largest;
if(l<=n && (
A[l][0]>A[i][0] || (
A[l][0]==A[i][0] && A[l][1]<A[i][1]
)
)) largest=l;
else largest=i;
if(r<=n && (
A[r][0]>A[largest][0] || (
A[r][0]==A[largest][0] && A[r][1]<A[largest][1]
)
)) largest=r;
if(i!=largest){
swap(A,i,largest);
max_heapify(A, n, largest);
}
return ;
}
void build_max_heap(long A[][2], long size) {
int i;
for(i=size; i>=1; i--) {
max_heapify(A,size,i);
}
return ;
}
void max_heap_insert(long A[][2],long &size,long key[2]) {
size++;
A[size][0]=0;
A[size][1]=key[1];
heap_increase_key(A, size, key[0]);
}
int heap_extract_max(long A[][2], long &size) {
char c=str[A[1][1]];
int i;
int key_i=-1;
if(A[1][0]==1||size==0) return key_i;
key_i=A[1][1];
cout<<c;
//printf("%c ",c);
for(i=A[1][1]; A[1][0]!=0 ; i++) {
if(str[i]==c) {
cout<<" "<<i+1;
//printf("%d ",i+1);
str[i]='*';
A[1][0]--;
}
}
cout<<endl;
swap(A,1,size);
size--;
max_heapify(A,size,1);
return key_i;
}
void erase_from_heap(long A[][2], long &size, long i) {
A[i][0]=A[size][0];
A[i][1]=A[size][1];
size--;
max_heapify(A, size, i);
}
void max_heap_merger(long A[][2], long &size, int key_i) {
int r,key_r;
int l,key_l;
key_r=strlen(str);
key_l=-1;
l=0;
r=0;
int i;
for(i=1; i<=size; i++) {
if(str[A[i][1]] != '*') {
if(A[i][1]>key_l && A[i][1]<key_i) {
key_l = A[i][1];
l=i;
}
if(A[i][1]>key_i && A[i][1]<key_r) {
key_r = A[i][1];
r=i;
}
}
}
if(l==0 || r==0 || str[key_l]!=str[key_r]) return ;
long key[2];
key[0]=A[l][0]+A[r][0];
key[1]=A[l][1];
erase_from_heap(A, size, l);
for(i=1; i<=size; i++) if(A[i][1]==key_r) break;
erase_from_heap(A, size, i);
max_heap_insert(A, size, key);
return ;
}
int input(long A[][2]) {
cin.getline(str, 1000000);
//scanf("%s",str);
int size=1;
int i;
char c;
A[size][0]=1;
A[size][1]=0;
c=str[0];
for(i=1; str[i]!='\0'; i++) {
if(c==str[i]) {
A[size][0]++;
} else {
size++;
A[size][0]=1;
A[size][1]=i;
c=str[i];
}
}
return size;
}
void sovle() {
size=input(heap);
build_max_heap(heap, size);
int key_i;
while((key_i=heap_extract_max(heap,size))!=-1) {
max_heap_merger(heap,size, key_i);
}
return ;
}
int main() {
//freopen("e:\\in.dat", "r", stdin);
sovle();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator