看见网上题解全是AC自动机
HASH应该也可以吧
洛谷上HASH过了
bzoj交后不到1s告诉我超时,你的时限可是10s啊(雾
后来想了一下,应该是空间开太大了
HASH代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N=1e6;
ll p[N+10],h[205][N];
int A[300];
ll get(int x,int l,int r){
return h[x][r]-h[x][l-1]*p[r-l+1];
}
char s[N];
int n;
ll Cal(ll x,int len){
ll ans=0;
for(int i=1;i<=n;++i){
for(int j=len;j<=A[i];++j){
if(x==get(i,j-len+1,j))++ans;
}
}
return ans;
}
int main(){
cin>>n;
p[0]=1;
for(int i=1;i<=N;++i)p[i]=p[i-1]*131;
for(int i=1;i<=n;++i){
s[0]='a';
scanf("%s",s+1);
int len=strlen(s)-1;
A[i]=len;
for(int j=1;j<=len;++j){
h[i][j]=h[i][j-1]*131+s[j]-'a'+1;
}
}
for(int i=1;i<=n;++i){
cout<<Cal(h[i][A[i]],A[i])<<endl;
}
}
后来洛谷上发现,STL的find也可以过,23333
不清楚find里边是拿什么实现的
#include<bits/stdc++.h>
using namespace std;
int n;
string st[205];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>st[i];
for(int i=1;i<=n;i++){
int ans=0;
for(int j=1;j<=n;j++){
int k=0,l=st[j].find(st[i],k);
while(l!=-1){
k=l+1;
l=st[j].find(st[i],k);
ans++;
}
}
cout<<ans<<endl;
}
}