UVa11488 Hyper Prefix Sets

来源:互联网 发布:mysql unique查询 编辑:程序博客网 时间:2024/05/29 13:23

1.题目描述:点击打开链接

2.解题思路:本题用Trie解决。根据题意,我们需要维护一条路径上每个结点的字符出现的次数,可以边插入边统计。接下来就是遍历每一个字符串了,遍历的时候更新ans即可。

3.代码:

#include<iostream>#include<algorithm>#include<cassert>#include<string>#include<sstream>#include<set>#include<bitset>#include<vector>#include<stack>#include<map>#include<queue>#include<deque>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<cctype>#include<complex>#include<functional>#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define rep(i,n) for(int i=0;i<(n);i++)#define me(s) memset(s,0,sizeof(s))#define pb push_back#define lid (id<<1)#define rid (id<<1|1)typedef long long ll;typedef pair<int,int> P;const int maxn=50000+10;const int maxlen=200;const int sigma_size=2;int ans;struct Trie{    int ch[maxlen*maxn][sigma_size];    int val[maxlen*maxn]; //维护每个结点的字符出现的次数    int sz;    void clear(){sz=1;me(ch[0]);}    int idx(char c){return c-'0';}    void insert(char*s)    {        int n=strlen(s),u=0;        for(int i=0;i<n;i++)        {            int c=idx(s[i]);            if(!ch[u][c])            {                me(ch[sz]);                val[sz]=0;                ch[u][c]=sz++;            }            u=ch[u][c];            val[u]++;        }    }    void query(char*s)    {        int u=0,n=strlen(s);        for(int i=0;i<n;i++)        {            int c=idx(s[i]);            u=ch[u][c];            ans=max(ans,(i+1)*val[u]);        }    }};Trie solver;char text[maxn][210];int main(){    int T;    scanf("%d",&T);    while(T--)    {        int n;        scanf("%d",&n);        solver.clear();        for(int i=0;i<n;i++)        {            scanf("%s",text[i]);            solver.insert(text[i]);        }        ans=0;        for(int i=0;i<n;i++)        {            solver.query(text[i]);        }        printf("%d\n",ans);    }}


0 0
原创粉丝点击