CCF - 202112-3 登机牌条码 202112-4 磁盘文件操作

第三题只得了80分,没脸写题解,先放着吧

#include <bits/stdc++.h>
using namespace std;
void numCode(const string& s, vector<int> &stepCode){
    vector<int> num;
    //大写模式:0,小写模式:1,数字模式:2
    int mode = 0;
    for(char i : s){
        if(mode == 0){
            if(i >= 'A' && i <= 'Z'){
                num.push_back(i - '0' - 17);
            }else if(i >= 'a' && i <= 'z'){
                num.push_back(27);
                num.push_back(i - '0' - 49);
                mode = 1;
            }else{
                num.push_back(28);
                num.push_back(i - '0');
                mode = 2;
            }
        }else if(mode == 1){
            if(i >= 'A' && i <= 'Z'){
                num.push_back(28);
                num.push_back(28);
                num.push_back(i - '0' - 17);
                mode = 0;
            }else if(i >= 'a' && i <= 'z'){
                num.push_back(i - '0' - 49);
            }else{
                num.push_back(28);
                num.push_back(i - '0');
                mode = 2;
            }
        }else{
            if(i >= 'A' && i <= 'Z'){
                num.push_back(28);
                num.push_back(i - '0' - 17);
                mode = 0;
            }else if(i >= 'a' && i <= 'z'){
                num.push_back(27);
                num.push_back(i - '0' - 49);
                mode = 1;
            }else{
                num.push_back(i - '0');
            }
        }
    }
    if(num.size() % 2 == 1){
        num.push_back(29);
    }
    for(int i = 0; i < num.size(); i = i + 2){
        stepCode.push_back(num[i] * 30 + num[i + 1]);
    }
}

void dataCode(int width, int k, vector<int> &stepCode){
    //校验码的数量 k
    //有效数据码的数量
    int dataNum = (int)stepCode.size();
    //外加一个长度码字,所以现在的总数是;
    int len = k + dataNum + 1;
    if(len % width != 0){
        //还差fill个数,总数len能被行宽整除
        int fill = width - len % width;
        len += fill;
        while(fill--){
            stepCode.push_back(900);
        }
    }
    stepCode.insert(stepCode.begin(), len - k);
}
//根据校验级别 s 算出 g(x) 各项的系数
//2的9次方是512
int gMax = 1;
int pow_mod(int a,int b,int c)
{
    int ans = 1,base=a;// ans:结果;base:底数
    base = base % c;
    //【考虑0次方的情况】
    if(b==0){
        return 1%c;// 任意a的0次幂都是1,故直接用1%c即可
    }
    while(b){
        if(b & 1) // 与运算,判断奇偶性
            ans = (ans*base) % c;
        b = b >> 1;// 右移一位,相当于除2
        base = (base * base) % c;
    }
    return ans;
}
void gModulus(int k, vector<int> &g){
    //初始为(x - 3)
    g[1] = 1;
    g[0] = -3;
    for(int i = 2; i <= k; i++){
        for(int j = gMax; j >= 0; j--){
            g[j + 1] = (g[j] % 929 + 929) % 929;
        }
        g[0] = 0;
        //表示要乘以(x - va)
        int va = pow_mod(3, i, 929) % 929;
        for(int j = 0; j <= gMax; j++){
            g[j] = (((((0 - va) * g[j + 1]) % 929 + 929) % 929 + g[j]) % 929 + 929) % 929;
        }
        gMax++;
    }
}
int dMax = 0;
void dModulus(int k, vector<int> &stepCode, vector<int> &d){
    int n = (int)stepCode.size();
    dMax = n - 1 + k;
    for(int i = n - 1, j = 0; i >= 0 && j < stepCode.size(); i--, j++){
        d[i + k] = (stepCode[j] % 929 + 929) % 929;
    }
}
void checkCode(int k, vector<int> &stepCode){
    vector<int> g(100000);
    vector<int> qg(100000);
    vector<int> d(100000);
    gModulus(k, g);
    dModulus(k, stepCode, d);
    for(int i = dMax; i >= 0 && d[i] != 0; i--){
        int mul = ((d[i] - qg[i]) % 929 + 929) % 929;
        for(int j = gMax, p = 0; j >= 0 && i >= p; j--, p++){
            qg[i - p] = ((((mul * g[j]) % 929 + 929) % 929 + qg[i - p]) % 929 + 929) % 929;
        }
    }
    for(int i = k - 1; i >= 0; i--){
        stepCode.push_back((qg[i] % 929 + 929) % 929);
    }
}

int main(){
    int w;
    int s;
    cin >> w >> s;
    string str;
    cin >> str;
    vector<int> stepCode;
    int k = s == -1 ? 0 : pow_mod(2, s + 1, 929);
    numCode(str, stepCode);
    dataCode(w, k, stepCode);
    if(s != -1){
        checkCode(k, stepCode);
    }
    for(int i : stepCode){
        cout << i << endl;
    }
}

第四题只得了25分,也放着吧

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author DELL
 */
//一块磁盘空间
class Disk{
    //占用这块空间的程序ID
    int programId;
    //存入的数据
    int data;
    //上一次占用这块空间的程序ID
    int lastProcessId;
    //上一次存入的数据
    int lastData;

    public Disk() {
        this.programId = -1;
        this.lastProcessId = -1;
    }

    public Disk(int programId, int data, int lastProcessId, int lastData) {
        this.programId = programId;
        this.data = data;
        this.lastProcessId = lastProcessId;
        this.lastData = lastData;
    }

    public int getProgramId() {
        return programId;
    }

    public void setProgramId(int programId) {
        this.programId = programId;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public int getLastProcessId() {
        return lastProcessId;
    }

    public void setLastProcessId(int lastProcessId) {
        this.lastProcessId = lastProcessId;
    }

    public int getLastData() {
        return lastData;
    }

    public void setLastData(int lastData) {
        this.lastData = lastData;
    }
}
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String nm = sc.nextLine();
        String[] km = nm.split(" ");
        int n = Integer.parseInt(km[0]);
        int m = Integer.parseInt(km[1]);
        int k = Integer.parseInt(km[2]);
        Disk[] disk = new Disk[m + 2];
        for(int i = 0; i <= m; i++){
            disk[i] = new Disk();
        }
        for(int i = 0; i < k; i++){
            String operator = sc.nextLine();
            String[] s = operator.split(" ");
            List<Integer> operation = new ArrayList<>();
            for (String value : s) {
                operation.add(Integer.parseInt(value));
            }
            if(operation.get(0) == 0){
                int temp = 0;
                int value = 0;
                for(int j = operation.get(2); j <= operation.get(3) && (disk[j].getProgramId() == -1 || disk[j].getProgramId() == operation.get(1)); j++){
                    temp = 1;
                    value = j;
                    disk[j].setLastProcessId(disk[j].getProgramId());
                    disk[j].setLastData(disk[j].getData());
                    disk[j].setProgramId(operation.get(1));
                    disk[j].setData(operation.get(4));
                }
                if(temp == 0){
                    System.out.println(-1);
                }
                if(temp == 1){
                    System.out.println(value);
                }
            }else if(operation.get(0) == 1){
                int temp = 0;
                for(int j = operation.get(2); j <= operation.get(3); j++){
                    if(disk[j].getProgramId() != operation.get(1)){
                        temp = 1;
                        System.out.println("FAIL");
                        break;
                    }
                }
                if(temp == 0){
                    for(int j = operation.get(2); j <= operation.get(3); j++){
                        disk[j].setLastProcessId(disk[j].getProgramId());
                        disk[j].setLastData(disk[j].getData());
                        disk[j].setProgramId(-1);
                        disk[j].setData(0);
                    }
                    System.out.println("OK");
                }
            }else if(operation.get(0) == 2){
                int temp = 0;
                for(int j = operation.get(2); j <= operation.get(3); j++){
                    if(disk[j].getLastProcessId() != operation.get(1) || disk[j].getProgramId() != -1){
                        temp = 1;
                        System.out.println("FAIL");
                        break;
                    }
                }
                if(temp == 0){
                    for(int j = operation.get(2); j <= operation.get(3); j++){
                        disk[j].setProgramId(disk[j].getLastProcessId());
                        disk[j].setData(disk[j].getLastData());
                    }
                    System.out.println("OK");
                }
            }else{
                if(disk[operation.get(1)].getProgramId() == -1){
                    System.out.println("0 0");
                }else{
                    System.out.println(disk[operation.get(1)].getProgramId() + " " + disk[operation.get(1)].getData());
                }
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值