1. 程式人生 > >codeforces gym 101164 K Cutting 字符串hash

codeforces gym 101164 K Cutting 字符串hash

暴力 print pre clas 暴力枚舉 cut ash pac lin

題意:給你兩個字符串a,b,不區分大小寫,將b分成三段,重新拼接,問是否能得到A;

思路:暴力枚舉兩個斷點,然後check的時候需要字符串hash,O(1)復雜度N*N;

題目鏈接:傳送門

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include
<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define LL long long #define pi (4*atan(1.0)) #define eps 1e-8 #define bug(x) cout<<"bug"<<x<<endl; const int N=5e3+10,M=2e6+10,inf=1e9+10; const LL INF=1e18+10
,mod=1e9+7; string a,b,c; unsigned int ma[N][N],mc[N][N]; int check(int l1,int r1,int l2,int r2,int l3,int r3) { int s=0,e=r1-l1; if(ma[s][e]!=mc[l1][r1])return 0; s=e+1,e=s+r2-l2; if(ma[s][e]!=mc[l2][r2])return 0; s=e+1,e=s+r3-l3; if(ma[s][e]!=mc[l3][r3])return 0;
return 1; } void output(int l1,int r1,int l2,int r2,int l3,int r3) { for(int i=l1;i<=r1;i++) printf("%c",b[i]); printf("\n"); for(int i=l2;i<=r2;i++) printf("%c",b[i]); printf("\n"); for(int i=l3;i<=r3;i++) printf("%c",b[i]); printf("\n"); } int main() { cin>>a>>b; int n=a.size();c=""; for(int i=0;i<n;i++) if(a[i]>=A&&a[i]<=Z)a[i]=a[i]-A+a; for(int i=0;i<n;i++) if(b[i]>=A&&b[i]<=Z)c+=b[i]-A+a; else c+=b[i]; int tot=0; for(int i=0;i<n;i++) { unsigned int seed = 131; // 31 131 1313 13131 131313 etc.. unsigned int has= 0; for(int j=i;j<n;j++) { has=has*seed+(a[j]); ma[i][j]=(has & 0x7FFFFFFF); } } for(int i=0;i<n;i++) { unsigned int seed = 131; // 31 131 1313 13131 131313 etc.. unsigned int has= 0; for(int j=i;j<n;j++) { has=has*seed+(c[j]); mc[i][j]=(has & 0x7FFFFFFF); } } for(int i=1;i<=n-2;i++) { for(int j=i;j<=n-2;j++) { if(check(0,i-1,i,j,j+1,n-1)) { printf("YES\n"); output(0,i-1,i,j,j+1,n-1); return 0; } if(check(0,i-1,j+1,n-1,i,j)) { printf("YES\n"); output(0,i-1,j+1,n-1,i,j); return 0; } if(check(i,j,0,i-1,j+1,n-1)) { printf("YES\n"); output(i,j,0,i-1,j+1,n-1); return 0;; } if(check(i,j,j+1,n-1,0,i-1)) { printf("YES\n"); output(i,j,j+1,n-1,0,i-1); return 0;; } if(check(j+1,n-1,0,i-1,i,j)) { printf("YES\n"); output(j+1,n-1,0,i-1,i,j); return 0; } if(check(j+1,n-1,i,j,0,i-1)) { printf("YES\n"); output(j+1,n-1,i,j,0,i-1); return 0;; } } } printf("NO\n"); return 0; }

codeforces gym 101164 K Cutting 字符串hash