普通视图

发现新文章,点击刷新页面。
昨天以前Lu Shuyu

如何优雅地使用VSCode写C/C++并自动格式化

作者 lushuyu
2022年3月30日 21:56

如何在VSCode里面格式化C/C++代码呢?

1 相关工作

  • 在网上能搜索到的配置办法基本上都是相互复读。
  • 绝大部分使用Powershell调用clang-format生成.clang-format文件的操作对新人不友好。
  • 编辑Settings.json的操作对新人不友好。
  • 一些配置办法无法自定义大括号不换行。
  • 右键格式化在我的VSCode上不好使。
  • 我当初摸索的时候被以上五条整的差点自闭。

2 配置方法

  • 首先,正确安装C/C++插件
  • 打开设置面板,完成以下设置。
  • 搜索 Format on Save 并勾选
  • 搜索 formatter 并选中C/C++
  • 搜索 Clang_format_fallback Style 并在里面写上 {BasedOnStyle: LLVM, IndentWidth: 4}

这样每次保存代码的时候都会自动格式化了。

3 结语

我的方法可能不是最佳方法,但是是比较实用的,没有很繁琐的设置,不用写json。

我的代码习惯是4宽的制表符,并且大括号不换行。在自己自定义的时候可以修改BasedOnStyle改成其他可能的值(在设置列表里面列出了),找到自己最舒服的那种Style。

题解 CCF-CSP-18-C 化学方程式 AcWing 3284

作者 lushuyu
2021年11月30日 15:58

题目传送门

题解

这个题是一道恶心人的大模拟,如何处理检查配平情况呢?要找出所有的原子,计数,然后比对等号两边各种原子的数量。

处理原子可以用 unordered_map,但是效率不高切更难写,我们可以开一个 $27*27$ 的数组,把原子转换为数组下标,这样更高效。

关于括号的嵌套,我的想法是开一个 tag 数组,先扫一个化学式,确定括号的位置以及化学计量数,然后更新 tag,正数代表乘,负数代表除。

还有一个容易出现的 bug:数字有可能出现很多位,刚开始我只考虑了一位,所以调了很久。

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 27 * 27 + 5;

#define SIZ s.size()

int a[N], b[N];
int tag[1005];

int n;

int ans;

string s;

void div1(string str) {
    // cout << str << endl;

    for (int i = 0; i < str.size();) {
        int j = i + 1;
        while (str[j] != '+' && j < str.size())
            j++;
        string cur = str.substr(i, j - i);
        i = j + 1;
        int times = 1;
        int now = 0;
        memset(tag, 0, sizeof tag);
        if (cur[0] >= '1' && cur[0] <= '9') {
            int number = 0;

            while (cur[now] >= '0' && cur[now] <= '9') {
                number = number * 10 + cur[now] - '0';
                now++;
            }
            times *= number;
            now--;
        }
        while (now < cur.size()) {
            if (cur[now] == '(') {
                int l = 1, k = now + 1;
                while (1) {
                    if (cur[k] == '(')
                        l++;
                    if (cur[k] == ')')
                        l--;
                    if (l == 0) {
                        int tmp = 0;
                        if (cur[k + 1] < '0' || cur[k + 1] > '9')
                            tmp = 1;
                        int p = k + 1;
                        while (cur[p] >= '0' && cur[p] <= '9') {
                            tmp = tmp * 10 + cur[p] - '0';
                            p++;
                        }

                        tag[now] = tmp;
                        tag[k] = tmp * -1;
                        cerr << "add tag on " << now << " value = " << tmp
                             << endl;
                        break;
                    }
                    k++;
                }
            }
            now++;
        }

        now = 0;
        while (1) {
            if (now >= cur.size())
                break;

            if (tag[now] > 0)
                times *= tag[now];
            if (tag[now] < 0)
                times /= tag[now] * -1;
            if (!((cur[now] >= 'a' && cur[now] <= 'z') ||
                  (cur[now] >= 'A' && cur[now] <= 'Z'))) {
                now++;
                continue;
            }
            int tim = 1;
            if ((cur[now + 1] >= 'A' && cur[now + 1] <= 'Z') ||
                cur[now + 1] == '(' || cur[now + 1] == ')' ||
                now + 1 >= cur.size()) {
                a[(cur[now] - 'A' + 1) * 10] += 1 * times;
                cerr << "find " << cur[now] << " 我们给他加上了 " << 1 * times
                     << endl;
            }
            if ((cur[now + 1] >= '0' && cur[now + 1] <= '9')) {
                int number = 0;
                int p = now + 1;
                while (cur[p] >= '0' && cur[p] <= '9') {
                    number = number * 10 + cur[p] - '0';
                    p++;
                }

                a[(cur[now] - 'A' + 1) * 10] += (number)*times;

                cerr << "find " << cur[now] << number << " 我们给他加上了 "
                     << (number)*times << endl;
                now = p - 1;
            }
            if ((cur[now + 1] >= 'a' && cur[now + 1] <= 'z')) {
                if ((cur[now + 2] >= '0' && cur[now + 2] <= '9')) {

                    int number = 0;
                    int p = now + 2;
                    while (cur[p] >= '0' && cur[p] <= '9') {
                        number = number * 10 + cur[p] - '0';
                        p++;
                    }

                    cerr << "find Aa0" << cur[now] << cur[now + 1]
                         << cur[now + 2] << " 我们给他加上了 " << (number)*times
                         << endl;

                    a[(cur[now] - 'A' + 1) * 10 + cur[now + 1] - 'a' + 1] +=
                        (number)*times;
                    now = p - 1;

                } else {

                    cerr << "find Aa" << cur[now] << cur[now + 1]
                         << " 我们给他加上了 " << 1 * times << endl;

                    a[(cur[now] - 'A' + 1) * 10 + cur[now + 1] - 'a' + 1] +=
                        (1) * times,
                        now++;
                }
            }
            now++;
        }
        // for (int i = 0; i <= 20; i++)
        //     cout << tag[i] << " ";
        // cout << endl;
        // int qaq = 0;
    }
}

void div2(string str) {
    // cout << str << endl;

    for (int i = 0; i < str.size();) {
        int j = i + 1;
        while (str[j] != '+' && j < str.size())
            j++;
        string cur = str.substr(i, j - i);
        i = j + 1;
        int times = 1;
        int now = 0;
        memset(tag, 0, sizeof tag);
        if (cur[0] >= '1' && cur[0] <= '9') {
            int number = 0;

            while (cur[now] >= '0' && cur[now] <= '9') {
                number = number * 10 + cur[now] - '0';
                now++;
            }
            times *= number;
            now--;
        }
        while (now < cur.size()) {
            if (cur[now] == '(') {
                int l = 1, k = now + 1;
                while (1) {
                    if (cur[k] == '(')
                        l++;
                    if (cur[k] == ')')
                        l--;
                    if (l == 0) {
                        int tmp = 0;
                        if (cur[k + 1] < '0' || cur[k + 1] > '9')
                            tmp = 1;
                        int p = k + 1;
                        while (cur[p] >= '0' && cur[p] <= '9') {
                            tmp = tmp * 10 + cur[p] - '0';
                            p++;
                        }
                        tag[now] = tmp;
                        tag[k] = tmp * -1;
                        cerr << "add tag on " << now << " value = " << tmp
                             << endl;
                        break;
                    }
                    k++;
                }
            }
            now++;
        }

        now = 0;
        while (1) {
            if (now >= cur.size())
                break;

            if (tag[now] > 0)
                times *= tag[now];
            if (tag[now] < 0)
                times /= tag[now] * -1;
            if (!((cur[now] >= 'a' && cur[now] <= 'z') ||
                  (cur[now] >= 'A' && cur[now] <= 'Z'))) {
                now++;
                continue;
            }
            int tim = 1;
            if ((cur[now + 1] >= 'A' && cur[now + 1] <= 'Z') ||
                cur[now + 1] == '(' || cur[now + 1] == ')' ||
                now + 1 >= cur.size()) {
                b[(cur[now] - 'A' + 1) * 10] += 1 * times;
                cerr << "find " << cur[now] << " 我们给他加上了 " << 1 * times
                     << endl;
            }
            if ((cur[now + 1] >= '0' && cur[now + 1] <= '9')) {
                int number = 0;
                int p = now + 1;
                while (cur[p] >= '0' && cur[p] <= '9') {
                    number = number * 10 + cur[p] - '0';
                    p++;
                }

                b[(cur[now] - 'A' + 1) * 10] += (number)*times;

                cerr << "find " << cur[now] << number << " 我们给他加上了 "
                     << (number)*times << endl;
                now = p - 1;
            }
            if ((cur[now + 1] >= 'a' && cur[now + 1] <= 'z')) {
                if ((cur[now + 2] >= '0' && cur[now + 2] <= '9')) {

                    int number = 0;
                    int p = now + 2;
                    while (cur[p] >= '0' && cur[p] <= '9') {
                        number = number * 10 + cur[p] - '0';
                        p++;
                    }

                    cerr << "find Aa0" << cur[now] << cur[now + 1]
                         << cur[now + 2] << " 我们给他加上了 " << (number)*times
                         << endl;

                    b[(cur[now] - 'A' + 1) * 10 + cur[now + 1] - 'a' + 1] +=
                        (number)*times;
                    now = p - 1;

                } else {

                    cerr << "find Aa" << cur[now] << cur[now + 1]
                         << " 我们给他加上了 " << 1 * times << endl;

                    b[(cur[now] - 'A' + 1) * 10 + cur[now + 1] - 'a' + 1] +=
                        (1) * times,
                        now++;
                }
            }
            now++;
        }
        // for (int i = 0; i <= 20; i++)
        //     cout << tag[i] << " ";
        // cout << endl;
        // int qaq = 0;
    }
}

void pd() {
    for (int i = 0; i < N; i++)
        if (a[i] != b[i]) {
            cout << "N" << endl;
            return;
        }
    cout << "Y" << endl;
    return;
}

int main() {
    scanf("%d", &n);
    while (n--) {
        cin >> s;
        memset(a, 0, sizeof a);
        memset(b, 0, sizeof b);
        ans = 0;
        for (int i = 0; i < SIZ; i++) {
            if (s[i] != '=')
                continue;
            div1(s.substr(0, i));
            div2(s.substr(i + 1));
        }
        pd();
    }
}

题解 20CCF-CSP-T3点亮数字人生

作者 lushuyu
2021年9月21日 18:05

题目传送门

两次拓扑排序,剩下的就是码力了。

小插曲:用auto遍历会T飞。

#include<bits/stdc++.h>
using namespace std;

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}

//本题毒瘤

const int N=3000+5;
const int M=1e5+5;

struct edg{
    int from,to,nxt;
}g[M];

int head[N],cnt;

inline void add(int from,int to){
    g[++cnt].nxt=head[from];
    g[cnt].to=to;
    g[cnt].from=from;
    head[from]=cnt;
}

vector<int> in[N];
int d[N],ans[N];

int m,n,k;

void init(){
    memset(head,0,sizeof head);
    memset(d,0,sizeof d);
    cnt=0;
    for(int i=1;i<=n;i++) in[i].clear();
}

int toint(string s){
    int x=0;
    for(int i=1;i<s.size();i++) x=x*10+s[i]-'0';
    return x;

}

int dd[N];

struct que{
    vector<int> v,v2;
}q[10005];

bool topo1(){
    for(int i=m+1;i<=m+n;i++) dd[i]=d[i];
    queue<int>q2;
    int idx=0;
    for(int i=1;i<=m;i++){
        q2.push(i);
    }
    while(!q2.empty()){
        int u=q2.front();
        q2.pop();
        for(int i=head[u];i;i=g[i].nxt){
            int to=g[i].to;
            dd[to]--;
            if(!dd[to]) q2.push(to),idx++;
        }
        
    }
    return idx==n;
}

string ss[N];

int doit(int x){
    string sss=ss[x];
    if(sss=="NOT") {return (in[x][0]^1);}
    else if(sss=="AND"){
        int res=1;
        for(int i=0;i<in[x].size();i++) res=(res&in[x][i]);
        return res;
    }
    else if(sss=="NAND"){
        int res=1;
        for(int i=0;i<in[x].size();i++) res=(res&in[x][i]);
        return (res^1);
    }
    else if(sss=="OR"){
        int res=0;
        for(int i=0;i<in[x].size();i++) res=(res|in[x][i]);
        return res;
    }
    else if(sss=="XOR"){
        int res=0;
        for(int i=0;i<in[x].size();i++) res=(res^in[x][i]);
        return res;
    }
    else if(sss=="NOR"){
        int res=0;
        for(int i=0;i<in[x].size();i++) res=(res|in[x][i]);
        return (res^1);
    }
    else cout<<"wdnmd"<<endl;
}

void topo2(int x){
    queue<int>q2;
    for(int i=1;i<=m;i++) ans[i]=q[x].v[i-1], q2.push(i);
    for(int i=m+1;i<=m+n;i++) in[i].clear();
    while(!q2.empty()){
        int u=q2.front();
        q2.pop();
        for(int i=head[u];i;i=g[i].nxt){
            int to=g[i].to;
            in[to].push_back(ans[u]);
            if(in[to].size()==d[to]){
                ans[to]=doit(to);
                q2.push(to);
            }
        }
    }
}

int main(){
    int T=read();
    while(T--){
        init();
        m=read();n=read();
   //     cout<<"done"<<endl;
        string s;
        for(int i=1;i<=n;i++){
            cin>>ss[i+m]>>k;
     //   cout<<"done2"<<endl;
            d[i+m]=k;
            for(int j=0;j<k;j++){
                cin>>s;
                int x=toint(s);
                if(s[0]=='I') add(x,i+m);
                else add(x+m,i+m);
            }
        }
        int S=read();
        for(int i=0;i<S;i++){
            q[i].v.resize(m);
            for(int j=0;j<m;j++)  q[i].v[j]=read();
        }

        for(int i=0;i<S;i++){
            k=read();
            q[i].v2.resize(k);
            for(int j=0;j<k;j++)  q[i].v2[j]=read();
        }
        if(!topo1()){
            cout<<"LOOP"<<endl;
        }
        else{
            for(int i=0;i<S;i++){
                topo2(i);
                for(int j=0;j<q[i].v2.size();j++){
                    cout<<ans[q[i].v2[j]+m];
                    if(j!=q[i].v2.size()-1) cout<<" ";
                    else cout<<endl;
                }
            }
        }

    }
    return 0;
}


9月CCF-CSP游记与杂感

作者 lushuyu
2021年9月20日 00:06

今日去了计院里面参加了CCF-CSP考试,最后得分220/500,只能算一般般吧,在各路大佬里面算是矮了一截。

在打比赛的时候我就很明显地感觉到,一年多没有碰过算法竞赛的我,在重新面对一道道题时有多么吃力。T2的做法其实很容易想到,但是我却在写代码和调试上面花费了大量的时间。T3模拟题做了3h一分未得,先是快读出问题,后是莫名其妙wa,以至于我T4T5没有时间去做了。T4只写了个20pts的暴力,事实上正确做法就是个普通的状压dp,唉,一年多没写了,基本上都丢了。

不过比较好的消息是,参加本次竞赛有学分可拿,某些课程可以申请免修。但我仍然不满足于此啊,OI生涯已经给我留下了很大的遗憾,不能再次放弃机会了,12月的CCF-CSP我还要来!

我心里很明白,我大概率又要走上算法竞赛这一条路了。大学还有四年,未来的路还很长,一定要好好把握。我很努力地看清自己的位置,很认真地远视前方漫长的道路。我知道,我要开始了,从现在,到遥远的未来。

光荣啊!远视未来的人!

❌
❌