题解:AT_past202004_d パターンマッチ

· · 题解

枚举每一个可能的 t,判断是否合法。枚举的方法有很多:

:::info[代码]

提交记录。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans;
string s, t;
void dfs()
{
    if (t.size() > 3)
    {
        return;
    }
    if (t.size())
    {
        for (ll i = 0; i <= (ll)s.size() - (ll)t.size(); i++)
        // string/vector 等 STL 容器的 .size() 方法的返回值是无符号整数,代码中可能会遇到 s 比 t 长的情况,此时减出来负数会溢出变成一个很大的数导致错误。
        {
            bool flag = true;
            for (ll j = 0; j < t.size(); j++)
            {
                if (s[i + j] != t[j] && t[j] != '.')
                {
                    flag = false;
                    break;
                }
            }
            if (flag)
            {
                ans++;
                break;
            }
        }
    }
    for (char i = 'a'; i <= 'z'; i++)
    {
        t += i;
        dfs();
        t.pop_back();
    }
    t += '.';
    dfs();
    t.pop_back();
}
void solve()
{
    cin >> s;
    dfs();
    cout << ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    ll t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

:::