Forsaken喜欢字符串(哈希&map)
思路:因为 k k k很小,所以考虑用 m a p map map记录所有字符串的个数。
然后再用一个 m a p map map记录当前字符串长度为 l e n len len的子串个数。
然后两者相减求和即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+5;
#define mst(a) memset(a,0,sizeof a)
unordered_map<string,int>mp,now;
char s[N][6];
string fun(int i,int p,int len){
string ans="";
for(int j=p;j<p+len;j++)
ans+=s[i][j];
return ans;
}
int main(){
int n,k,q;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%s",s[i]+1);
for(int j=1;j<=k;j++)
for(int p=1;p<=k-j+1;p++)
mp[fun(i,p,j)]++;
}
scanf("%d",&q);
while(q--){
int x,len;
scanf("%d%d",&x,&len);
now.clear();
for(int i=1;i<=k-len+1;i++) now[fun(x,i,len)]++;
ll ans=0;
for(int i=1;i<=k-len+1;i++){
string str=fun(x,i,len);
ans+=mp[str]-now[str];
}
printf("%lld\n",ans*len);
}
return 0;
}