整理一下以前的模板
#include <iostream>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
string a, text;
ll pre[100010] = {-1};
void prefix_table(string mode)
{
for(int i = 1, j = 0; i < mode.length(); i++)
{
if(mode[i] == mode[j])
{
pre[i + 1] = pre[i] + 1;
j++;
}
else //若匹配不上再次匹配时从零开始
{
j = 0;
if(mode[i] == mode[j]) //从零的第一个单独判断一
{
pre[i + 1] = 1;
j++;
}
}
}
}
int judge(int beg, int end,int lenm) //向后跳转匹配
{
int i = beg - 1, j = 0, ans = 0;
while(i < end)
{
if(j == lenm - 1 && text[i] == a[j])
{
ans++;
}
if(text[i] == a[j])
{
i++;
j++;
}
else
{
j = pre[j];
if(j==-1)
{
i++;
j++;
}
}
}
return ans;
}
int main()
{
int lent, lenm, t;
cin>>lent>>lenm>>t;
cin>>text>>a;
prefix_table(a);
while(t--)
{
int beg, end;
cin>>beg>>end;
cout<<judge(beg, end, lenm)<<endl;
}
return 0;
}