# String# Matrix# Greedy# Input/Output

c356 - Justin 愛加密

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個整數 N 代表秘文長度,以及一個長度為 N * N 的字串,要求輸出其中真正想表達的字串,該字串是從 N x N 的字串中提取對角線上的字元。

解題思路

題目描述了將 N x N 的字串視為一個矩陣,然後提取其對角線上的字元來解密訊息。程式碼首先讀取 N 的值,然後讀取長度為 N * N 的字串。接著,它迭代字串,並將對角線上的字元輸出。由於題目限制記憶體為 16MB,程式碼使用了 getchar_unlocked()putchar_unlocked() 來提高 I/O 效率,避免使用緩衝 I/O。++a 的作用是為了讓對角線的起始位置正確。

複雜度分析

  • 時間複雜度: O(N^2)
  • 空間複雜度: O(1)

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
int main(){
	int a,s=0;
	char b;
	scanf("%d",&a);
	b=getchar_unlocked();
	++a;
	while(b=getchar_unlocked()){
		if(b==-1)break;
		if(!s)putchar_unlocked(b);
		if(++s==a)s=0;
	}
}

Discussion