由于bzoj没有题面,我就yy一下题意好啦
首先这题很明显没有讲清楚,到底是子串翻转还是全串
然后就写的翻转子串,此时我们可以发现一个串可以得到它的所有排列
然后把所有字符拿出来装在桶里hash一下,过掉了。。
下来被神犇各种D,说我这个完全是错的。。好吧读了下题面发现题读错了
然而数据太水,跑的飞起(好孩子不要学习我)
//Copyright(c)2015 liuchenrui
#include<cstdio>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#define ull unsigned long long
#define H 233333333ull
using namespace std;
inline void splay(int &v){
v=0;char c=0;int p=1;
while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
v*=p;
}
map<ull,int> hash;
ull gethash(int *s,bool isjoin){
ull p=17;
for(int i=0;i<=25;i++){
p*=H;p+=(ull)s[i];s[i]=0;
}
if(isjoin){
hash[p]++;return 0;
}
else{
return (ull)hash[p];
}
}
int lenn,lenm;
char s[4000010];
int Q[30];
int n,m,las;
ull ans;
int main(){
cin>>n>>m>>lenn>>lenm;
las=lenn+lenm>>1;
if(lenn+lenm&1)puts("0"),exit(0);
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int i=1;i<=min(las,lenn);i++)Q[s[i]-'a']++;
for(int i=las+1;i<=lenn;i++)Q[s[i]-'a']--;
for(int i=0;i<=25;i++)if(Q[i]<0)goto end1;
gethash(Q,1);end1:;
}
for(int i=1;i<=m;i++){
scanf("%s",s+1);
for(int i=1;i<=min(las,lenm);i++)Q[s[i]-'a']++;
for(int i=las+1;i<=lenm;i++)Q[s[i]-'a']--;
for(int i=0;i<=25;i++)if(Q[i]<0)goto end2;
ans+=(ull)gethash(Q,0);end2:;
}
cout<<ans<<endl;
//cerr<<clock()<<endl;
}