WA了一个点
查看原帖
WA了一个点
327567
zhy_learn楼主2024/5/24 22:35

WA on 01_random_05.txt

hash判字串,求助

#include<bits/stdc++.h>
#define Fu(i,a,b) for(int i=a;i<=b;i++)
#define Fd(i,a,b) for(int i=a;i>=b;i--)
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
using namespace std;
int fi[3005],ne[1000005],to[1000005],fl[1000005],cnt=1;
void add(int u,int v,int f){
   ne[++cnt]=fi[u],to[cnt]=v,fl[cnt]=f,fi[u]=cnt;
   ne[++cnt]=fi[v],to[cnt]=u,fl[cnt]=0,fi[v]=cnt;
}
int s,t,dep[3005],cur[3005],q[3005],l,r;
bool bfs(){
   Fu(i,1,t) dep[i]=-1,cur[i]=fi[i];
   l=0,r=1,q[1]=s,dep[s]=0;
   while(l<r){
   	int o=q[++l];
   	for(int i=fi[o];i;i=ne[i]){
   		int v=to[i];
   		if(fl[i]&&dep[v]==-1){
   			dep[v]=dep[o]+1;
   			q[++r]=v;
   		}
   	}
   }
   return dep[t]!=-1;
}
int dfs(int t,int o,int in){
   if(o==t||!in) return in;
   int out=0;
   for(int &i=cur[o];i;i=ne[i]){
   	int v=to[i];
   	if(fl[i]&&dep[v]==dep[o]+1){
   		int tmp=dfs(t,v,min(fl[i],in));
   		in-=tmp,out+=tmp;
   		fl[i]-=tmp,fl[i^1]+=tmp;
   	}
   	if(!in) break;
   }
   if(!out) dep[o]=-1;
   return out;
}
long long dinic(){
   long long sum=0,f;
   while(bfs()) while((f=dfs(t,s,0x7fffffff))) sum+=f;
   return sum;
} 
const int bas=37; 
int n,a[105],len[105],hsh[105][5005],pw[5005],bj[105][105];
long long ans;
char S[105][5005];
bool check(int x,int y){
   Fu(i,len[x],len[y]){
   	if(hsh[x][len[x]]==hsh[y][i]-pw[len[x]]*hsh[y][i-len[x]]) return 1;
   }return 0;
}
int main(){
   scanf("%d",&n);
   Fu(i,1,n) scanf("%s",S[i]+1),len[i]=strlen(S[i]+1);
   Fu(i,1,n) scanf("%d",&a[i]),ans+=a[i];
   pw[0]=1;
   Fu(i,1,5000) pw[i]=pw[i-1]*bas;
   Fu(i,1,n){
   	Fu(j,1,len[i]) hsh[i][j]=hsh[i][j-1]*bas+S[i][j];
   }
   Fu(i,1,n) Fu(j,1,n) if(i!=j) bj[i][j]=len[i]<=len[j]?check(i,j):0;
   s=n*2+1,t=2*n+2;
   Fu(i,1,n) add(s,i,a[i]),add(i+n,t,a[i]);
   Fu(i,1,n) Fu(j,1,n) if(bj[i][j]) add(i,j+n,0x7fffffff);
   printf("%lld",ans-dinic()); 
   return 0;
}
2024/5/24 22:35
加载中...