C - 1 - SAT

看了官网提供的题解,发现这个思路很巧妙,同时也作为对STL中的set容器的学习吧

题目分析

这道题需要一个set容器来储存输入的字符串。

测试数据无非有两类:以!开头的字符串和没有以!开头的字符串 。输入的如果是以!开头的字符串,那么把!去掉后再在set容器查找一下是否有匹配的元素,如果存在的话,输出匹配的元素,结束程序运行;对于非!开头的元素,那么在容器查找一下加上!后是否有匹配的元素,如果存在的话,输出匹配的元素,结束程序运行。如果无匹配元素,那么将输入的字符串储存在容器中。

我原本的思路是储存完字符串之后,再遍历一遍 好暴力qwq ,但这个思路完全是反过来了:判断完再储存。对于我这蒟蒻来说这个思路确实是想不到,顺便也学习了set的一些用法。

AC代码

#include<bits/stdc++.h>
using namespace std;
int n;
string ss;
set<string> s;
int main(){
    ios_base::sync_with_stdio(false);
    ios::sync_with_stdio(false);

    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> ss;
        if(ss[0] == '!'){
            string t = ss; 
            t.erase(t.begin());
            if(s.count(t)){
                cout << t << endl; return 0;
            }

        }
        else {
            string t = "!" + ss;
            if(s.count(t)){
                cout << ss << endl; return 0;
            }
        }
        s.insert(ss);
    }
    cout << "satisfiable" << endl;

    return 0;
}