hdu2328——Corporate Identity

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

也是求共同子串的问题,也是比较暴力,就是这次匹配的时候没用find而是用kmp来匹配

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
#define _clr(x,a) memset(x,a,sizeof(x));
using namespace std;
const int N=4020;
string s[N];
int n;
int Next[N];
void kmp_pre(string a){
    int l=a.size();
    _clr(Next,0);
    Next[0]=-1;
    int i=0;
    int j=-1;
    while(i<l){
        if(j==-1 || a[i]==a[j]){
            Next[++i]=++j;
        }
        else{
            j=Next[j];
        }
    }
}
int kmp(string s,string p){
    kmp_pre(p);
    int sl=s.size();
    int pl=p.size();
    int i=0,j=0;
    while(i<sl && j<pl){
        if(j==-1 || s[i]==p[j]){
            i++;
            j++;
        }
        else{
            j=Next[j];
        }
    }
    if(j==pl){
        return i-j;
    }
    else{
        return -1;
    }
}
int main(void){
    while(~scanf("%d",&n) && n){
        int _min=0x3f3f3f3f;
        int idx=0;
        for(int i=0;i<n;i++){
            cin>> s[i];
            if(s[i].size()<_min){
                _min=s[i].size();
                idx=i;
            }
        }
        bool flag=false;
        string sub;
        string ans;
        //枚举子串长度
        for(int i=_min;i>0;i--){
            //枚举子串起点
            for(int j=0;j+i<=_min;j++){
                sub=s[idx].substr(j,i);
                //匹配
                int k=0;
                for(;k<n;k++){
                    if(k==idx){
                        continue;
                    }
                    if(kmp(s[k],sub)==-1){
   
                        break;
                    }
                }
                if(k==n){
                    if(ans.compare("")==0 || ans.compare(sub)>0){
   
                        ans=sub;
                    }
                    flag=true;
                }
            }
            if(flag){
                break;
            }
        }
        if(flag){
            cout << ans << endl;
        }
        else{
            printf("IDENTITY LOST\n");
        }
    }
    return 0;
}
全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务