B. Peculiar Movie Preferences

B. Peculiar Movie Preferences

题意:
t组数据 给你n个长度最大不超过3的字符串 问是否存在方案使得几个按前后顺序拼起来后组成的字符串是回文串

思路:
因为有顺序要求 所以我们按先后顺序对当前字符串处理 然后减去这个字符串进行下一个字符串操作
1.单个字符串本来就是会问串: 长度为1 长度为2且两个字母相同 长度为三且第一个字母和第三个字母相同
2.2和2组 3和3组 反转当前字符串 看剩余字符串中是否存在反转后的字符串
3.3和2组 反转当前字符串的前两个字符组成新串 再找匹配
2和3组 因为2必须在前面 如果在当前字符串长度为二时 向后找长度为3的字符串比较麻烦 可以开一个名为two的map储存当前字符串之前长度为2的字符串
然后再在当前字符串是3的时候向前找能匹配的长度为2的字符串

#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<array>
#include<unordered_map>
#include<ctime>
#include<random>
#define ll long long
#define ull unsigned long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const ll inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-10;
const ll N = 1e5 + 5;
const ll M = 1e5 + 5;
const ll mod = 998244353;
int n;
string s[N];
map<string, int>two, all;

void solve() {
	cin >> n;
	int f = 0;
	two.clear(); all.clear();
	for (int i = 1; i <= n; i++) {
		cin >> s[i];
		all[s[i]]++;
		if (s[i].size() == 1) f = 1;
		if (s[i].size() == 2 && s[i][0] == s[i][1]) f = 1;
		if (s[i].size() == 3 && s[i][0] == s[i][2]) f = 1;
	}

	for (int i = 1; i <= n; i++) {
		if (s[i].size() == 2) {
			two[s[i]]++;
			string tt = s[i];
			reverse(tt.begin(), tt.end());
			if (all[tt]) f = 1;
		}

		if (s[i].size() == 3) {
			string tt = s[i];
			reverse(tt.begin(), tt.end());
			if (all[tt]) f = 1;

			string s1 = "", s2 = "";
			s1 += s[i][0]; s1 += s[i][1];
			s2 += s[i][1]; s2 += s[i][2];
			reverse(s1.begin(), s1.end());
			reverse(s2.begin(), s2.end());
			if (all[s1] || two[s2]) f = 1;
		}
		all[s[i]]--;
	}

	if (f) cout << "YES\n";
	else cout << "NO\n";
}

signed main() {
	IOS;
	int t = 1;
	cin >> t;
	while (t--) {
		solve();
	}
}
posted @ 2022-08-30 11:33  Yaqu  阅读(52)  评论(0)    收藏  举报