zoukankan      html  css  js  c++  java
  • 04:病毒

    04:病毒

    总时间限制:
    1000ms
    内存限制:
    65535kB
    描述

        有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母。

      现在怎么恢复原来的文档呢!小y很聪明,他在其他没有感染病毒的机器上,生成了一个由若干单词构成的字典,字典中的单词是按照字母顺序排列的,他把这个文件拷贝到自己的机器里,故意让它感染上病毒,他想利用这个字典文件原来的有序性,找到病毒替换字母的规律,再用来恢复其它文档。

      现在你的任务是:告诉你被病毒感染了的字典,要你恢复一个字母串。

    输入
    virus.in
    第一行为整数K(≤50000),表示字典中的单词个数。
    以下K行,是被病毒感染了的字典,每行一个单词。
    最后一行是需要你恢复的一串字母。
    所有字母均为小写。
    输出
    virus.out
    输出仅一行,为恢复后的一串字母。当然也有可能出现字典不完整、甚至字典是错的情况,这时请输出一个0。
    样例输入
    6
    cebdbac
    cac
    ecd
    dca
    aba
    bac
    cedab
    样例输出
    abcde
    思路自己看代码吧,
    注意特判



      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<stack>
      5 #include<cstdlib> 
      6 #include<cmath>
      7 const int MAXN=50000;
      8 using namespace std;
      9 string a[MAXN];
     10 int maxnlength;
     11 struct node
     12 {
     13     int u;
     14     int v;
     15     int w;
     16     int next;
     17 }edge[MAXN];
     18 int rudu[MAXN];
     19 int head[MAXN];
     20 int num=1;
     21 int ans[10001];//保存拓扑排序的结果 
     22 int now=1;
     23 int n;
     24 int maxnchar=0;
     25 int map[101][101];
     26 void topsort()
     27 {
     28     stack<int>s;
     29     for(int i=1;i<=maxnchar;i++)
     30     {
     31         if(rudu[i]==0)
     32         {
     33             s.push(i);
     34             ans[now]=i;
     35             now++;
     36         }
     37     }
     38     int flag=0;
     39     while(s.size()==1)
     40     {
     41         if(s.size()>1)
     42         {
     43             flag=1;
     44             break;
     45         }
     46         int p=s.top();
     47         s.pop();
     48         for(int i=head[p];i!=-1;i=edge[i].next)
     49         {
     50             rudu[edge[i].v]--;
     51             if(rudu[edge[i].v]==0)
     52             {
     53                 s.push(edge[i].v);
     54                 ans[now]=edge[i].v;
     55                 now++;
     56             }
     57         }
     58     }
     59     if(flag==1)
     60     {
     61         printf("0
    ");
     62         exit(0);
     63     }
     64 }
     65 int main()
     66 {
     67     
     68     scanf("%d",&n);
     69     for(int i=1;i<=n;i++)head[i]=-1;
     70     for(int i=1;i<=n;i++)
     71     {
     72         cin>>a[i];
     73         if(a[i].length()>maxnlength)
     74         maxnlength=a[i].length();
     75         for(int j=1;j<=a[i].length();j++)
     76         {
     77             if(a[i][j]-96>maxnchar)
     78             maxnchar=a[i][j]-96;
     79         }
     80     }
     81     int flag2=0;
     82     for(int i=2;i<=n;i++)
     83     {
     84         int j=i-1;
     85             for(int k=0;k<=min(a[i].length()-1,a[j].length()-1);k++)
     86             {
     87                 if(a[j][k]!=a[i][k])
     88                 {
     89                     if(map[a[j][k]-96][a[i][k]-96]==1||map[a[i][k]-96][a[j][k]-96]==1)
     90                     {
     91                         printf("0
    ");
     92                         return 0;
     93                     }
     94                     edge[num].u=a[j][k]-96;
     95                     edge[num].v=a[i][k]-96;
     96                     edge[num].next=head[edge[num].u];
     97                     head[edge[num].u]=num++;
     98                     rudu[a[i][k]-96]++;
     99                     flag2=1;
    100                     map[a[j][k]-96][a[i][k]-96]=1;
    101                     break;
    102                 }
    103             }
    104             //if(flag2==1)break;
    105     }
    106     topsort();
    107     char sr[101];
    108     char huiche[1];
    109     gets(huiche);
    110     gets(sr);
    111     int l=strlen(sr);
    112     //int srl=sr.length();
    113     for(int i=0;i<=l;i++)
    114     {
    115         if(sr[i]-96>maxnchar)
    116         {
    117             printf("0
    ");
    118             return 0;
    119         }
    120     }
    121     for(int i=0;i<=l;i++)
    122     {
    123         for(int j=1;j<=now-1;j++)
    124         {
    125             if(ans[j]==sr[i]-96)
    126             {
    127                 printf("%c",char(j+96));
    128             }
    129         }
    130     }
    131     return 0;
    132 }
  • 相关阅读:
    LeetCode 728. Self Dividing Numbers
    LeetCode 400. Nth Digit
    LeetCode 326. Power of Three
    LeetCode 263. Ugly Number
    LeetCode 258. Add Digits
    详解 CSS 属性
    tr:hover变色的问题
    Java包(package)的命名规范
    javascript中的后退和刷新
    cannot be resolved to a type 错误解决方法
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6719097.html
Copyright © 2011-2022 走看看