题解 P7861 [COCI2015-2016#2] SAVEZ
更逊的阅读体验
模拟赛原题,赛时一直在肝另一题就没做
Solution
求最长子序列的题,显然可以
考虑怎么判断一个字符串为另一个字符串的的前缀和后缀。我们有一个很妙的做法:把字符串
对于这些二元组,我们可以直接建
关于实现,由于这棵 ab,我们可以把它转化为一个数 (a-'A')*26+(b-'A'),并用
Code
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n,m,ans,tot,f[N],id[N];char s[N];
unordered_map<int,unordered_map<int,int>>g;//Trie
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",s+1);m=strlen(s+1);
int u=0;
for(int j=1;j<=m;j++){
f[i]=max(f[i],f[id[u]]+1);
int w=(s[j]-'A')*26+s[m-j+1]-'A';//正反合并
if(g[u].find(w)==g[u].end())g[u][w]=++tot;//动态开点
u=g[u][w];
}if(id[u])f[i]=max(f[i],f[id[u]]+1);
ans=max(ans,f[i]);id[u]=i;
}printf("%d\n",ans);
return 0;
}
最后祝各位