RE球挑
  • 板块P2353 背单词
  • 楼主ln001
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/30 20:11
  • 上次更新2023/12/30 22:39:18
查看原帖
RE球挑
644963
ln001楼主2023/12/30 20:11
#include "bits/stdc++.h"
#define fst                           \
    std::ios::sync_with_stdio(false); \
    cin.tie(0);                       \
    cout.tie(0);
#define ll long long
#define f(x, y, z) for (register ll x = (y); x <= (z); x++)
using namespace std;
const ll INF = 0x3f3f3f3f3f3f3f3f, M = 12, N = 1e6 + 10;
ll m, q;
string s;
string w[M];
ll br[M], qj[M][N];
void jqj(long long y)
{
    string k = w[y] + "#" + s;
    memset(br, 0, sizeof(br));
    f(i, 2, k.size() - 1) 
    {
        long long p = br[i - 1];
        while (p && k[i] != k[p+1])
            p = br[p];
        if (k[i] == k[p+1])
            br[i] = p + 1;

        if (i - w[y].size() > 0)
        {
            if (br[i] == w[y].size() - 1)
                qj[y][i - w[y].size()] = qj[y][i - w[y].size() - 1] + 1;
            else
                qj[y][i - w[y].size()] = qj[y][i - w[y].size() - 1];
        }
    }
    return;
}
signed main()
{
    fst;
    cin >> m >> q;
    cin >> s;
    f(i, 1, m)
    {
        cin >> w[i];
        w[i] = " " + w[i];
        jqj(i);
    }
    f(i, 1, q)
    {
        ll x, y;
        cin >> x >> y;
        ll ans = 0;
        f(j, 1, m)
        {
            if(y-x+1>=w[j].size()-1)
            ans += qj[j][y] - qj[j][x+w[j].size()-3];//
            
        }
        cout << ans << endl;
    }
    return 0;
}
2023/12/30 20:11
加载中...