病毒(信息学奥赛一本通-T1396)
生活随笔
收集整理的這篇文章主要介紹了
病毒(信息学奥赛一本通-T1396)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【題目描述】
有一天,小y突然發(fā)現(xiàn)自己的計算機感染了一種病毒!還好,小y發(fā)現(xiàn)這種病毒很弱,只是會把文檔中的所有字母替換成其它字母,但并不改變順序,也不會增加和刪除字母。
現(xiàn)在怎么恢復原來的文檔呢!小y很聰明,他在其他沒有感染病毒的機器上,生成了一個由若干單詞構成的字典,字典中的單詞是按照字母順序排列的,他把這個文件拷貝到自己的機器里,故意讓它感染上病毒,他想利用這個字典文件原來的有序性,找到病毒替換字母的規(guī)律,再用來恢復其它文檔。
現(xiàn)在你的任務是:告訴你被病毒感染了的字典,要你恢復一個字母串。
【輸入】
第一行為整數(shù)K(≤50000),表示字典中的單詞個數(shù)。
以下K行,是被病毒感染了的字典,每行一個單詞。
最后一行是需要你恢復的一串字母。
所有字母均為小寫。
【輸出】
輸出僅一行,為恢復后的一串字母。當然也有可能出現(xiàn)字典不完整、甚至字典是錯的情況,這時請輸出一個0。
【輸入樣例】
6
cebdbac
cac
ecd
dca
aba
bac
cedab
【輸出樣例】
abcde
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #include<set> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 50001 #define MOD 123 #define E 1e-6 using namespace std; int n; int a[N][101],g[27][27]; int enter[27],vis[27],sum[27]; int cnt; int p; void judge(int x,int y) {if(a[x][y]==0||a[x+1][y]==0)return ;if(a[x][y]!=a[x+1][y]){g[a[x][y]][a[x+1][y]]=1;enter[a[x+1][y]]++;}elsejudge(x,y+1); } bool topsort() {for(int i=1;i<=27;++i)if(vis[i])cnt++;for(int i=1;i<n;++i)judge(i,1);int work,temp;while(p!=cnt){work=0;for(int i=1;i<=cnt;++i){if(enter[i]==0){temp=i;enter[i]=-1;work++;}}if(work!=1)return false;sum[++p]=temp;for(int i=1;i<=cnt;++i){if(g[temp][i]){g[temp][i]=0;enter[i]--;}}}return true; } int main() {cin>>n;for(int i=1;i<=(n+1);i++){string str;cin>>str;for(int j=0;j<str.size();j++){a[i][++a[i][0]]=int(str[j]+1-'a');vis[str[j]+1-'a']=1;}}if(!topsort())cout<<0;else{for(int i=1;i<=a[n+1][0];++i){for(int j=1;j<=cnt;++j){if(a[n+1][i]==sum[j]){cout<<char(j-1+'a');break;}}}}return 0; }?
總結
以上是生活随笔為你收集整理的病毒(信息学奥赛一本通-T1396)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划 —— 区间 DP —— 石子
- 下一篇: C++语言基础 —— STL —— 容器