解题思路
读题后,我们可以发现,字母串 只能从两边删除,于是我们可以枚举一个区间 ,然后在字母串 中匹配(可以用指针来进行匹配),同时可以做字符串哈希去重。
注意
如果怕被卡,可以用双模哈希;
记得开 long long
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,b=131,len;
char s[3001],t[3001];
long long m1=1e9+7,m2=998244353;
pair<int,int> a[6000001];
main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
cin>>s+1;
cin>>t+1;
int h1,h2,p;
for(int i=1;i<=n;i++)
{
h1=0,h2=0,p=1;
for(int j=i;j<=n;j++)
{
while(p<=n&&s[p]!=t[j])p++;
if(p>n)break;
p++;
h1=(1ll*h1*b+t[j])%m1;
h2=(1ll*h2*b+t[j])%m2;
a[++len]=make_pair(h1,h2);
}
}
sort(a+1,a+len+1);
int ans=unique(a+1,a+len+1)-a-1;
cout<<ans;
return 0;
}
标签:P7469,洛谷,NOI,int,h1,cin,long,h2,len
From: https://blog.csdn.net/2403_87021226/article/details/142768246