T2的另一种做法
K匹配
https://ac.nowcoder.com/acm/contest/7613/B
T2的std用了kmp,但是我在场上做题时没想到用这种算法(其实是太菜了不会)(划掉
我的思路是对两个字符串都跑一遍hash,再用hash找出第一个字符串中的匹配位置,将每个相等子串左右两边将没有计算过的(字符串长度+1)乘起来累加到答案中。
这样说起来可能不太清楚,可以尝试自己把字符串写下来,再配合代码食用。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #define ha 10000010 using namespace std; typedef unsigned long long ll; int len1,len2; char s1[ha],s2[ha]; ll hsh[ha],hsh2[ha]; ll hshlen[ha]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>len1>>len2; cin>>(s1+1); cin>>(s2+1); hshlen[0]=1; for(int i=1;i<=len1;++i){ hsh[i]=hsh[i-1]*131+(s1[i]-'a'+1); hshlen[i]=hshlen[i-1]*131; } for(int i=1;i<=len2;++i){ hsh2[i]=hsh2[i-1]*131+(s2[i]-'a'+1); } ll ans=0; int cnt=0,lst=0; for(int i=1;i+len2-1<=len1;++i){ if(hsh[i+len2-1]-hsh[i-1]*hshlen[len2]==hsh2[len2]){ ++cnt; ll lft=i-1-lst; ll rit=len1-(i+len2-1); ans+=(lft+1)*(rit+1); lst=i; } } cout<<ans<<endl; return 0; }