[數據約束和評分方法]
60%的測試數據中:1<=N <= 1 000
100%的測試數據中:1<=N <= 20 000php
TLEios
#include<cstdio> #include<iostream> using namespace std; int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return f?x:-x; } const int N=1e5+10; int n,a[N],b[N],f[2][N]; int main(){ n=read();n*=5; for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) b[i]=read(); int now=0; for(int i=1;i<=n;i++){ now^=1; for(int j=1;j<=n;j++){ if(a[i]==b[j]){ f[now][j]=f[now^1][j-1]+1; } else{ f[now][j]=max(f[now^1][j],f[now][j-1]); } } } printf("%d",f[now][n]); return 0; }
AC數組
//f[k]表示s2匹配到s1的k位置,最大公共子串的長度 #include<cstdio> #include<iostream> using namespace std; int read(){ register int x=0;bool f=1; register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return f?x:-x; } const int N=1e5+10; int n,ans,pos[N][6],f[N]; int lowbit(int x){ return x&-x; } void updata(int x,int val){ for(int i=x;i<=n;i+=lowbit(i)) f[i]=max(f[i],val); } int query(int x){ int res=0; for(int i=x;i;i-=lowbit(i)) res=max(res,f[i]); return res; } int main(){ n=read();n*=5; for(int i=1,x;i<=n;i++) x=read(),pos[x][++pos[x][0]]=i; //加樹狀數組維護降至O(nlogn) for(int i=1,x;i<=n;i++){ x=read(); for(int j=5;j;j--){ int k=pos[x][j];//s1[j]=s2[1] f[k]=max(f[k],query(k-1)+1); updata(k,f[k]); ans=max(ans,f[k]); } } printf("%d",ans); return 0; }