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;
}