ZOJ 3817 Chinese Knot (字符串HASH)

来源:互联网 发布:windows rt看视频 编辑:程序博客网 时间:2024/05/21 10:32
 字符串HASH +搜索

str[j]=str[j-1]*seed+"str[j]"


#include <iostream>#include <cstdio>#include <cstring>#define ULL unsigned long long using namespace std;ULL str[9][100010];char s[100100];#define seed 107//#define M 100007771int n,m;int ans[100100];int ks,ke;int size;ULL HH[100010];bool dfs(int l,int k,ULL hash,int deep){//ans[k]=l/2*n+((l&1)?n-p+1:p);if(n+k>=m){for(int i=0;i<8;i++){if(i==(l^1))continue;int q=m-k;ULL ss=hash*HH[q]+str[i][q];//printf("l=%d,p=%d,k=%d,flag=%d\n",l,p,k,flag);if(ss==str[8][m]){ans[deep]=i;size=deep+1;ke=q;return true; }}return false;}for(int i=0;i<8;i++){ans[deep]=i;if(hash*HH[n]+str[i][n]!=str[8][k+n])continue;if(i!=(l^1)&&dfs(i,k+n,hash*HH[n]+str[i][n],deep+1)) return true;}return false; }bool solve(){for(int i=0;i<8;i++){for(int k=1;k<=n;k++){size=0;if(m>n-k+1){size=0;ks=k;ans[0]=i;if(dfs(i,n-k+1,str[i][n]-str[i][k-1]*HH[n-k+1],1))return true;}else{size=0;int ss=k+m-1;ks=k;ke=ss;ans[0]=i;if(str[i][ss]-str[i][k-1]*HH[m]==str[8][m])return true;}}}return false;}int main(){int t;scanf("%d",&t);HH[0]=1;for(int i=1;i<=100000;i++)HH[i]=HH[i-1]*seed;while(t--){scanf("%d%d",&n,&m);for(int i=0;i<4;i++){scanf("%s",s+1);str[i*2][0]=0;str[i*2+1][0]=0;for(int j=1;j<=n;j++){str[i*2][j]=str[i*2][j-1]*seed+s[j]-'a'+1;str[i*2+1][j]=str[i*2+1][j-1]*seed+s[n-j+1]-'a'+1;}}str[8][0]=0;scanf("%s",s+1);for(int j=1;j<=m;j++){str[8][j]=str[8][j-1]*seed+s[j]-'a'+1;}if(solve()){if(size==1){for(int i=ks;i<=ke;i++){printf("%d%s",ans[0]/2*n+((ans[0]&1)?(n-i+1):i),i==ke?"\n":" ");}}else if(size==2){for(int i=ks;i<=n;i++){printf("%d ",ans[0]/2*n+((ans[0]&1)?(n-i+1):i));}for(int i=1;i<=ke;i++)printf("%d%s",ans[1]/2*n+((ans[1]&1)?(n-i+1):i),i==ke?"\n":" ");}else{for(int i=ks;i<=n;i++){printf("%d ",ans[0]/2*n+((ans[0]&1)?(n-i+1):i));}for(int i=1;i<=size-2;i++){for(int j=1;j<=n;j++){printf("%d ",ans[i]/2*n+((ans[i]&1)?(n-j+1):j));}}size--;for(int i=1;i<=ke;i++)printf("%d%s",ans[size]/2*n+((ans[size]&1)?(n-i+1):i),i==ke?"\n":" ");}}else{printf("No solution!\n");}}}




0 0
原创粉丝点击