传送门
题解:模板题,分类讨论。
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 1000010
#define lint long long
using namespace std;
int nxt[N],pos[N];lint cs[N],ct[N];
char s[N],t[N];
inline int get_nxt(char *s,lint *c,int n)
{
// for(int i=1;i<=n;i++)
// printf("%lld-%c ",c[i],s[i]);
// printf("\n");
nxt[1]=0;
for(int i=2,j;i<=n;i++)
{
j=nxt[i-1];
while(j&&(s[i]!=s[j+1]||c[i]!=c[j+1])) j=nxt[j];
if(s[i]==s[j+1]&&c[i]==c[j+1]) j++;nxt[i]=j;
}
return 0;
}
inline int KMP(char *s,lint *c1,char *t,lint *c2,int n,int m)
{
int c=0;
for(int i=1,j=0;i<=n;i++)
{
while(j&&(s[i]!=t[j+1]||c1[i]!=c2[j+1])) j=nxt[j];
if(s[i]==t[j+1]&&c1[i]==c2[j+1]) j++;
if(j==m) pos[++c]=i-m+1,j=nxt[j];
}
return c;
}
inline int Get(char *s,lint *c,int m)
{
int n=0;
while(m--)
{
n++;scanf("%lld-%c",&c[n],&s[n]);
if(n>1&&s[n]==s[n-1]) c[n-1]+=c[n],n--;
}
return n;
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
n=Get(s,cs,n),m=Get(t,ct,m);
if(n<m) return !printf("0\n");
// for(int i=1;i<=n;i++)
// printf("%lld-%c ",cs[i],s[i]);
// printf("\n");
// for(int i=1;i<=m;i++)
// printf("%lld-%c ",ct[i],t[i]);
// printf("\n");
if(m==1)
{
lint ans=0;
for(int i=1;i<=n;i++)
if(s[i]==t[1]) ans+=max(0ll,cs[i]-ct[1]+1);
printf("%lld\n",ans);return 0;
}
else if(m==2)
{
int ans=0;
for(int i=1;i<n;i++)
if(s[i]==t[1]&&s[i+1]==t[2])
ans+=(cs[i]>=ct[1]&&cs[i+1]>=ct[2]);
printf("%d\n",ans);return 0;
}
int c,ans=0;get_nxt(t+1,ct+1,m-2);
c=KMP(s,cs,t+1,ct+1,n,m-2);
for(int i=1;i<=c;i++)
{
int x=pos[i]-1,y=pos[i]-1+m-1;
if(!x||y>n) continue;
if(s[x]!=t[1]||s[y]!=t[m]) continue;
if(cs[x]>=ct[1]&&cs[y]>=ct[m]) ans++;
}
printf("%d\n",ans);return 0;
}