POJ3450 Corporate Identity

本文介绍了一种使用后缀数组解决寻找多个字符串中最长公共子串的问题,通过连接字符串并利用特殊字符分隔,实现对多个商标标识中共同字母序列的有效识别。
Corporate Identity
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 4672 Accepted: 1765

Description

Beside other services, ACM helps companies to clearly state their “corporate identity”, which includes company logo but also other signs, like trademarks. One of such companies is Internet Building Masters (IBM), which has recently asked ACM for a help with their new identity. IBM do not want to change their existing logos and trademarks completely, because their customers are used to the old ones. Therefore, ACM will only change existing trademarks instead of creating new ones.

After several other proposals, it was decided to take all existing trademarks and find the longest common sequence of letters that is contained in all of them. This sequence will be graphically emphasized to form a new logo. Then, the old trademarks may still be used while showing the new identity.

Your task is to find such a sequence.

Input

The input contains several tasks. Each task begins with a line containing a positive integer N, the number of trademarks (2 ≤ N ≤ 4000). The number is followed by N lines, each containing one trademark. Trademarks will be composed only from lowercase letters, the length of each trademark will be at least 1 and at most 200 characters.

After the last trademark, the next task begins. The last task is followed by a line containing zero.

Output

For each task, output a single line containing the longest string contained as a substring in all trademarks. If there are several strings of the same length, print the one that is lexicographically smallest. If there is no such non-empty string, output the words “IDENTITY LOST” instead.

Sample Input

3
aabbaabb
abbababb
bbbbbabb
2
xyz
abc
0

Sample Output

abb
IDENTITY LOST

Source

题意:找出所给字符串里里最长的公共部分。。

分析:这题可以用KMP做,但最近一直学后缀数组也就用后缀数组写了下,把输入的串连起来每个串之间用一个特殊字符隔开成为一个串,然后就相当于求这个串的不可重叠的最长子串,二分长度算,在输入串的时候给每个串的每个字符上个编号以便judge,judge里面就是要找出满足这个长度的的串,这里就要用到输入时的标记。。具体看代码。。


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1000010;
int r[MAXN],wa[MAXN],wb[MAXN],ws[MAXN],wv[MAXN],sa[MAXN];
int rank[MAXN],height[MAXN],id[MAXN];
char s[2100];
int cmp(int *r,int a,int b,int l)
{
    return r[a]==r[b]&&r[a+l]==r[b+l];
}
void da(int *r,int *sa,int n,int m)
{
    int i,j,p,*x=wa,*y=wb,*t;
    for(i=0;i<m;i++)
        ws[i]=0;
    for(i=0;i<n;i++)
        ws[x[i]=r[i]]++;
    for(i=1;i<m;i++)
        ws[i]+=ws[i-1];
    for(i=n-1;i>=0;i--)
        sa[--ws[x[i]]]=i;
    for(p=1,j=1;p<n;m=p,j*=2)
    {
        for(p=0,i=n-j;i<n;i++)
            y[p++]=i;
        for(i=0;i<n;i++)
            if(sa[i]>=j)
            y[p++]=sa[i]-j;
        for(i=0;i<n;i++)
            wv[i]=x[y[i]];
        for(i=0;i<m;i++)
            ws[i]=0;
        for(i=0;i<n;i++)
            ws[wv[i]]++;
        for(i=1;i<m;i++)
            ws[i]+=ws[i-1];
        for(i=n-1;i>=0;i--)
            sa[--ws[wv[i]]]=y[i];
        for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)
            x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    }
    return;
}
void calheight(int *r,int *sa,int n)
{
    int i,j,k=0;
    for(i=1;i<=n;i++)
        rank[sa[i]]=i;
    for(i=0;i<n;height[rank[i++]]=k)
        for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
    return;
}
int vis[4010],m;
char res[2100];
bool judge(int mid,int n)
{
    int flag=0,tot=1,bg,i;  //tot计数
    memset(vis,-1,sizeof(vis));
    for(i=1;i<=n;i++)
    {
        int t=id[sa[i]];    //找到当前sa属于的那个串
        if(t==0)
        {
            flag++;
            tot=1;
            continue;
        }
        if(height[i]<mid)   //分组了
        {
            vis[t]=++flag;  //避免和前面的重复
            tot=1;
            bg=sa[i];
        }
        else
        {
            if(vis[t]!=flag)
            {
                vis[t]=flag;
                tot++;
            }
        }
        if(tot>=m)  //tot达到m了,也就满足条件了
        {
            for(int j=0;j<mid;j++)
                res[j]=(char)r[bg+j];
            res[mid]='\0';
            return 1;
        }
    }
    return 0;
}
int main()
{
    int n,i,j;
    while(scanf("%d",&m)==1&&m)
    {
        n=0;
        int op=130;
        for(i=1;i<=m;i++)
        {
            scanf("%s",s);
            for(j=0;s[j];j++)
            {
                r[n]=s[j];
                id[n++]=i;
            }
            r[n++]=op++;
        }
        n--;
        r[n]=0;
        da(r,sa,n+1,op+1);
        calheight(r,sa,n);
        int ll=0,rr=n,ans=0;
        while(ll<=rr)
        {
            int mid=(ll+rr)>>1;
            if(judge(mid,n))
            {
                ans=max(ans,mid);
                ll=mid+1;
            }
            else
                rr=mid-1;
        }
        if(ans)
            printf("%s\n",res);
        else
            printf("IDENTITY LOST\n");
    }
    return 0;
}


【源码免费下载链接】:https://renmaiwang.cn/s/gbu02 grep命令是一个强大的文本处理工具,在Linux系统中被广泛使用。它能够有效地搜索文件中的特定模式,并提供灵活的匹配方式以满足不同需求。作为全名是Global Regular Expression Print的软件,grep采用基于posix标准的正则表达式系统,支持基本功能和扩展特性。 在实际操作中,用户可以通过调整选项来控制搜索结果的表现形式。例如,“-c”选项可以仅显示符合条件的结果数量,“-i”则能实现不区分大小写的匹配效果。“-n”帮助展示包含目标模式的具体行号,“-s”则用于隐藏错误信息,而“-v”则与之相反,只呈现不符合条件的行。 正则表达式的核心在于元字符的应用。这些特殊符号赋予了grep强大的搜索能力,从简单的字符匹配到复杂的模式构建都能胜任。例如,“^”和“$”分别标识文本的起始和结束位置;方括号内部的字符可以进行范围匹配;转义操作允许用户解除默认含义的影响。 实践过程中,用户会发现部分正则表达式功能仅限于grep的基本版本,而更复杂的扩展需要借助egrep或pcre库的支持。此外,结合perl语言风格的正则表达式接口也能进一步提升搜索效率。 值得注意的是,在使用这些工具时,开发者需特别留意特殊字符的转义规则以及括号内的范围限定。通过深入理解和灵活运用这些机制,用户可以充分发挥grep的强大功能,完成各种复杂的文本处理任务。 综上所述,熟练掌握grep命令及其背后的正则表达式知识将显著提升文本处理效率和准确性。希望本文能为您提供有价值的参考和指导。
【源码免费下载链接】:https://renmaiwang.cn/s/uc6y9 在现代生活中,路由器扮演着不可或缺的角色,整合了多项服务器功能以极大地方便了网络管理与维护。然而,这种集成也可能引入网络安全性和稳定性的潜在风险。当路由器无法正确分配IP地址时,可能导致网络故障并影响局域网的正常运作。本文将深入探讨如何解决此类问题。遇到多数客户端无法获取IP地址或登录速度缓慢的情况,建议首先运行该系统的`ipconfig`命令检查配置设置。如果发现客户端无法从路由器获得IP地址,并排除了基本故障后,应关注路由器的状态。若交换机指示灯正常且无拥堵或死机现象,则可能与路由器的 DHCP(动态主机配置协议)服务出现故障有关。 DHCP 作为局域网中自动分配IP地址的关键组件,确保网络设备正确连接上因特网至关重要。当客户端首次接入网络时,会向 DHCP服务器发送一个 DHCP discover广播包以获取IP地址。在Windows系统中,默认情况下,若1秒内未收到响应,客户端将在几秒后尝试(共4次)。如果始终无法获得响应,将显示错误信息并提示用户等待5分钟后重新连接。当DHCP服务器无响应或未被客户端接受时,也会导致IP分配失败。深入分析 DHCP工作流程可发现潜在问题可能源于服务器未能做出适当回应或丢失了部分响应包。在确认网络硬件配置无误(如网线连通)后,问题很可能与 DHCP 服务器相关。大量客户端请求可能导致服务器资源耗尽,从而降低响应速度并引发网络拥塞现象。为提升整体服务质量,理想做法是增强服务器性能或增加服务器数量,通过专设不同功能的服务器来优化负载分配。对于预算有限的机构(如学校),购买额外设备可能不切实际,在这种情况下需要对现有架构进行优化以避免过载问题。潜在解决方案包括限制客户端连接数、调整 DHCP 租约时间或升级路由器硬件和软件性能,同时建议定期维护服务器以确保其
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值