文件感染 - milo103/Algorithm-Problem GitHub Wiki

public class UserSolution {

static int index =0;
static int SIZE = 40000;
final static int root_key = 10000;
static Node []hashpool = new Node[SIZE+10];
static Node []head = new Node[SIZE+10];
static Node root ;
public static class Node{
	boolean isfile;
    int filesize;
	int oldsize;
	int id;
	Node parent;
	Node child;
	Node brother;
	Node next;
}
Node getNewnode(){
	index++;
	return hashpool[index-1];
}
public static void init(){
	index =0;
	for(int i =0;i< SIZE+10;i++){
		head[i] = new Node();
		hashpool[i]=new Node();
	}
root = new Node();
root.id = root_key;
	insert(root,head[root_key]);
}
public static int getKey(int values){
	return values%(SIZE+10);
}
private Node getNodebyhash(int keypid) {
	int id = getKey(keypid);
	Node newnode = head[id].next;
	while(newnode != null){
		if(newnode.id == id){
			return newnode;
		}
		newnode = newnode.next;
	}
	return null;
}
private Node createNewnode(int id, int filesize) {
	Node newnode = getNewnode();
	newnode.id = id;
	if(filesize!=0){
		newnode.filesize = filesize;
		newnode.oldsize = filesize;
		newnode.isfile = true;
	}else{
		newnode.isfile = false;
	}
	return newnode;
}
public int add(int id, int pid, int fileSize) {
	Node pidnode = getNodebyhash(pid);
	int key = getKey(id);
	Node newnode = createNewnode(key,fileSize);
newnode.brother = pidnode.child;
newnode.parent = pidnode;
pidnode.child = newnode;
insert(newnode,head[key]);
	return getsize(pidnode);
}
public static int getfilenum(Node node){
	int num =0;
	if(node.filesize !=0)
		return 1;
	Node current = node.child;
	while(current != null){
		num += getfilenum(current);
		current = current.brother;
	}
	return num;
}
static void insert(Node newnode, Node parentnode){
	newnode.next = parentnode.next;
	parentnode.next = newnode;
}
public int move(int id, int pid) {
	Node movenode = getNodebyhash(id);
	Node newparentnode = getNodebyhash(pid);
if(movenode.parent.child == movenode){
	movenode.parent.child = movenode.brother;
}else{
	Node current = movenode.parent.child;
	while(current.brother != movenode){
		current = current.brother;
	}
	current.brother = movenode.brother;
}
movenode.parent = newparentnode;
movenode.brother = newparentnode.child;
newparentnode.child = movenode;
return getsize(newparentnode);
}
public int remove(int id) {
	Node movenode = getNodebyhash(id);
	Node parentnode = movenode.parent;
if(parentnode.child == movenode){
	parentnode.child = movenode.brother;
}else{
	Node current = parentnode.child;
	while(current.brother != movenode){
		current = current.brother;
	}
	current.brother = movenode.brother;
}
	return getsize(movenode);
}
public int recover(int id) {
	Node node = getNodebyhash(id);
	updatReover(node);
	return getsize(node);
}
public void updatReover(Node node){
	if(node.filesize!=0){
		node.filesize = node.oldsize;
		return ;
	}
	Node current = node.child;
	while(current!=null){
		updatReover(current);
		current = current.brother;
	}
}
public int infect(int id) {
	int totalsize = getsize(root);
	if(totalsize ==0)
		return 0;
Node infectnode = getNodebyhash(id);
int num = getfilenum(root);
int addsize = totalsize/num;
updateInfect(infectnode, addsize);
	return getsize(infectnode);
}
private void updateInfect(Node node, int addsize) {
	if(node.filesize !=0){
		node.filesize += addsize;
		return ;
	}
	Node current = node.child;
	while(current!= null){
		updateInfect(current,addsize);
		current = current.brother;
	}
}
public int getsize(Node pidnode) {
	int total =0;
	if(pidnode.filesize!=0 )
		return pidnode.filesize;
Node current = pidnode.child;
while(current != null){
	total += getsize(current);
	current = current.brother;
}
	return total;
}
public String getObject(){
StringBuilder sb= new StringBuilder();
int totalsize = getsize(root);
if(totalsize ==0)
	return sb.append("totalsize: 0 file num: 0").toString();
	int num = getfilenum(root);
	int addsize = totalsize/num;
	 sb.append("totalsize: "+totalsize +" file num: "+num +" addsize "+ addsize);
	return sb.toString();
}

}

⚠️ **GitHub.com Fallback** ⚠️