【2018.5.12】模拟赛之二-ssl2414 简写单词【字符串】

正题


题目大意

若干个字符串,每个字符串求一个前缀,使只有这个字符串有这个前缀。


解题思路

O ( n 2 ) 枚举两个字符串,然后 O ( n ) 求出至少要取到哪里做前缀这两个字符串才不会冲突。


代码

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,ms,ans,l[51];
char s[51][51];
int main()
{
    //freopen("abbreviate.in","r",stdin);
    //freopen("abbreviate.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%s",s[i]);
        l[i]=strlen(s[i]);//输入取长度
    }
    for (int i=1;i<=n;i++)
    {
        ans=-1;
        for (int j=1;j<=n;j++){
            if (i==j) continue;
            ms=min(l[i],l[j]);
            for (int k=0;k<ms;k++)
            {
                if (s[i][k]==s[j][k])//重复就需要继续往后取
                {
                    ans=max(ans,k);//取最大值
                }
                else break;
            }
        }
        for (int k=0;k<=ans+1;k++)
          printf("%c",s[i][k]);//输出
        printf("\n");
    }
}

对拍程序

随机数据

#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<string>
#include<iostream>
#include<map>
#define random(x) rand()%x+1
using namespace std;
map<string,bool> ok,ok2;
int n,m;
string s;
int main()
{
    freopen("abbreviate.in","w",stdout);
    srand((unsigned)time(0));
    n=random(50);
    printf("%d\n",n);
    for (int i=1;i<=n;i++){
        m=random(50);
        s="";
        int j;
        for (j=1;j<=m;j++)
        {
            s+='a'+random(26)-1;
            if (ok2[s]) break;
        }
        if (!ok[s]&&j==m+1)
        {
            ok2[s]=true;
            cout<<s;
            printf("\n");
            string ss="";
            for (int i=0;i<s.size();i++)
            {
                ss+=s[i];
                ok[ss]=true;
            }
        }
        else n++;
    }
}

对拍

#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
    for (int t=1;t<=100000;t++)
    {
        system("abbreviatedata.exe");
        double st=clock();
        system("abbreviate.exe");
        double ed=clock();
        freopen("abbreviate.in","r",stdin);
        char s[51][51],d[51];
        int ans=0,n;
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            scanf("%s",s[i]);
        }
        fclose(stdin);
        freopen("abbreviate.out","r",stdin);
        for (int i=1;i<=n;i++)
        {
            scanf("%s",d);
            int l=strlen(d);
            ans=0;
            for (int j=1;j<=n;j++)
            {
                bool flag=false;
                for (int k=0;k<l;k++)
                {
                    if (s[j][k]!=d[k])
                    {
                        flag=true;
                        break;
                    }
                }
                if (!flag) 
                {
                    ans++;
                }
            }
            if (ans!=1) 
            {
                printf("Wrong Answer ");
                printf("%d",i);
                return 0;
            }
        }
        fclose(stdin);
        printf("AC point:%d time:%.0lfms\n",t,ed-st);
    }
}

猜你喜欢

转载自blog.csdn.net/mr_wuyongcong/article/details/80290467