第三题只得了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());
}
}
}
}
}