病毒

【问题描述】
  有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母。
  现在怎么恢复原来的文档呢!小y很聪明,他在其他没有感染病毒的机器上,生成了一个由若干单词构成的字典,字典中的单词是按照字母顺序排列的,他把这个文件拷贝到自己的机器里,故意让它感染上病毒,他想利用这个字典文件原来的有序性,找到病毒替换字母的规律,再用来恢复其它文档。
  现在你的任务是:告诉你被病毒感染了的字典,要你恢复一个字母串。
【输入格式】virus.in
  第一行为整数K(≤50000),表示字典中的单词个数。
  以下K行,是被病毒感染了的字典,每行一个单词。
  最后一行是需要你恢复的一串字母。
  所有字母均为小写。
【输出格式】virus.out
   输出仅一行,为恢复后的一串字母。当然也有可能出现字典不完整、甚至字典是错的情况,这时请输出一个0。
【输入样例】
  6
  cebdbac
  cac
  ecd
  dca
  aba
  bac
  cedab
【输出样例】
  abcde
先换成int型的吧,好写代码11101001
  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 string a[1001];int rude[1001],aa[1001][1001];
  7 int node[27][1];
  8 int top=0;
  9 struct sta
 10 {
 11     int sz[100001];
 12     int topp()
 13     {
 14         return sz[top];
 15     }
 16     void push(int x){
 17          sz[++top]=x;
 18     }
 19     void pop(){
 20         if(top>0)
 21         top--;
 22     }
 23     void cl()
 24     {
 25         top=0;
 26     }
 27     int size(){
 28         return top;
 29     }
 30 }stack;
 31 struct nodde{
 32     int u,v,next;
 33 }edge[10001];
 34 int num=1,head[1001];
 35 void edge_add(int x,int y)
 36 {
 37     edge[num].u=x;
 38     edge[num].v=y;
 39     edge[num].next=head[x];
 40     head[x]=num++;
 41 }
 42 void chushi()
 43 {
 44     for(int i=1;i<=26;i++)
 45     {
 46         head[i]=-1;rude[i]=0;
 47     }
 48     
 49 }
 50 int n;
 51 void in()
 52 {
 53     scanf("%d",&n);
 54 
 55     for(int i=1;i<=n;i++)
 56     {
 57         cin>>a[i];
 58     }
 59     
 60     for(int i=1;i<=n;i++)
 61     {
 62         for(int j=0;j<a[i].size();j++)
 63             aa[i][j]=int(a[i][j]-96);
 64     }
 65     for(int i=1;i<n;i++)
 66     {
 67          //cout<<aa[i+1][j]<<" "<<endl;
 68         for(int j=0;j<a[i].size();j++)
 69         {
 70             if(aa[i][j]!=aa[i+1][j])
 71             {
 72             
 73                 rude[aa[i+1][j]]++;
 74                 
 75                 edge_add(aa[i][j],aa[i+1][j]);
 76                 break;
 77             }
 78         }
 79     }
 80 }
 81 int main()
 82 {
 83     chushi();
 84     in();
 85     int number=0;
 86     int tot=0;
 87     for(int i=1;i<n;i++)
 88     {
 89         if(rude[i]==0)
 90         {
 91             tot++;
 92             stack.push(i);
 93         }
 94     }
 95     int step;
 96     while(stack.size()!=0)
 97     {
 98         step=stack.topp();
 99         node[step][0]=++number;
100         stack.pop();
101         for(int i=head[step];i!=-1;i=edge[i].next)
102         {
103             rude[edge[i].v]--;
104             if(rude[edge[i].v]==0)
105             {
106                 tot++;
107                 stack.push(edge[i].v);
108             }
109         }
110     }
111     if(tot!=n-1)
112     {
113         printf("0");
114         return 0;
115     }
116     string aaa;
117     cin>>aaa;
118     for(int i=0;i<aaa.size();i++)
119     {
120         cout<<char(node[int(aaa[i]-96)][0]+96);
121     }
122     return 0;
123 }

 

posted @ 2017-04-16 17:17  zzzzx  阅读(610)  评论(0编辑  收藏  举报