题解 CF784D Touchy-Feely Palindromes

题目由此去


思路:输入的是字符串,然后转换成盲文,将盲文转换成 $ 1 $和 $ 0 $
,即将盲文中实心的点设成 $ 1 $,空心的设成 $ 0 $。然后这样判断回文就很方便了。

特别注意

  • 第三行回文都是空心,所以第三行不用考虑;

  • 由于每个盲文都有两列,所以存 $ 1 $ $ 0 $ 的数组长度要开成字符串长度的两倍;

  • 为防止字符串长度过大,两倍空间要炸,所以我们开两个数组,分别存储第一行和第二行。


代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#define N 1000005

using namespace std;

string s;

int main() {
	cin >> s;
	int len = s.length();
	int a[len * 2 + 5], b[len * 2 + 5];
	for (int i=0, j=1; i<len, j<=len * 2; i++, j+=2 ) {
		if (s[i] == '1') {
			a[j] = 1;
			a[j + 1] = 0;
			b[j] = 0;
			b[j + 1] = 0;
		}
		if (s[i] == '2') {
			a[j] = 1;
			a[j + 1] = 0;
			b[j] = 1;
			b[j + 1] = 0;
		}
		if (s[i] == '3') {
			a[j] = 1;
			a[j + 1] = 1;
			b[j] = 0;
			b[j + 1] = 0;
		}
		if (s[i] == '4') {
			a[j] = 1;
			a[j + 1] = 1;
			b[j] = 0;
			b[j + 1] = 1;
		}
		if (s[i] == '5') {
			a[j] = 1;
			a[j + 1] = 0;
			b[j] = 0;
			b[j + 1] = 1;
		}
		if (s[i] == '6') {
			a[j] = 1;
			a[j + 1] = 1;
			b[j] = 1;
			b[j + 1] = 0;
		}
		if (s[i] == '7') {
			a[j] = 1;
			a[j + 1] = 1;
			b[j] = 1;
			b[j + 1] = 1;
		}
		if (s[i] == '8') {
			a[j] = 1;
			a[j + 1] = 0;
			b[j] = 1;
			b[j + 1] = 1;
		}
		if (s[i] == '9') {
			a[j] = 0;
			a[j + 1] = 1;
			b[j] = 1;
			b[j + 1] = 0;
		}
		if (s[i] == '0') {
			a[j] = 0;
			a[j + 1] = 1;
			b[j] = 1;
			b[j + 1] = 1;
		}
	}
	for (int i=1, j=len*2; i<=len, j>=len + 1; i++, j-- ) 
		if (a[i] != a[j] || b[i] != b[j]) {
			printf("No\n");
			return 0;
		}
	printf("Yes\n");
	return 0;
}
posted @ 2021-08-27 11:47  铭矾  阅读(76)  评论(0)    收藏  举报