病毒()-其他
病毒()
#include<bits/stdc++.h>
using namespace std;
#define N 50005
int k;
char ch[N][100];
char a[N];
int mp[N][100],in[N],out[N];
char ans[N];
int cnt;
queue<int> q;
inline int read()
{
int x=0;
bool f=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=0;
for(;isdigit(ch);ch=getchar())
x=(x<<1)+(x<<3)+ch-'0';
return f?x:(~(x-1));
}
int main()
{
k=read();
for(int i=1;i<=26;i++)
in[i]=-1;
for(int i=1;i<=k;i++)
{
scanf("%s",ch[i]);
}
scanf("%s",a);
for(int i=0;i<strlen(a);i++)
{
in[a[i]-'a'+1]=0;
}
for(int i=1;i<k;i++)
{
int x=i+1;
int len=min(strlen(ch[i]),strlen(ch[x]));
// cout<<i<<" vs "<<x<<endl;
for(int j=0;j<len;j++)
{
if(ch[i][j]==ch[x][j])continue;
int o=ch[i][j]-'a'+1,p=ch[x][j]-'a'+1;
// cout<<o<<" "<<p<<endl;
in[p]++;
out[o]++;
mp[o][out[o]]=p;
break;
}
}
// cout<<endl;
for(int i=1;i<=26;i++)
{
// cout<<i<<" "<<in[i]<<endl;
if(in[i]==0)
{
q.push(i);
// cout<<(char)(i+'a'-1)<<endl;
cnt++;
ans[cnt]=i+'a'-1;
}
}
if(cnt!=1)
{
cout<<0;
return 0;
}
while(!q.empty())
{
int k=q.front();
q.pop();
for(int i=1;i<=out[k];i++)
{
int t=mp[k][i];
in[t]--;
if(in[t]==0)
{
q.push(t);
cnt++;
ans[cnt]=t+'a'-1;
}
}
}
// for(int i=1;i<=cnt;i++)
// {
// cout<<ans[i];
// }
// cout<<cnt;
// if(cnt==k)
// {cout<<"error"<<endl;
for(int i=0;i<strlen(a);i++)
{
for(int j=1;j<=cnt;j++)
{
if(a[i]==ans[j])
{
cout<<(char)(j+'a'-1);
break;
}
}
}
// }
return 0;
}
————————
#include<bits/stdc++.h>
using namespace std;
#define N 50005
int k;
char ch[N][100];
char a[N];
int mp[N][100],in[N],out[N];
char ans[N];
int cnt;
queue<int> q;
inline int read()
{
int x=0;
bool f=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=0;
for(;isdigit(ch);ch=getchar())
x=(x<<1)+(x<<3)+ch-'0';
return f?x:(~(x-1));
}
int main()
{
k=read();
for(int i=1;i<=26;i++)
in[i]=-1;
for(int i=1;i<=k;i++)
{
scanf("%s",ch[i]);
}
scanf("%s",a);
for(int i=0;i<strlen(a);i++)
{
in[a[i]-'a'+1]=0;
}
for(int i=1;i<k;i++)
{
int x=i+1;
int len=min(strlen(ch[i]),strlen(ch[x]));
// cout<<i<<" vs "<<x<<endl;
for(int j=0;j<len;j++)
{
if(ch[i][j]==ch[x][j])continue;
int o=ch[i][j]-'a'+1,p=ch[x][j]-'a'+1;
// cout<<o<<" "<<p<<endl;
in[p]++;
out[o]++;
mp[o][out[o]]=p;
break;
}
}
// cout<<endl;
for(int i=1;i<=26;i++)
{
// cout<<i<<" "<<in[i]<<endl;
if(in[i]==0)
{
q.push(i);
// cout<<(char)(i+'a'-1)<<endl;
cnt++;
ans[cnt]=i+'a'-1;
}
}
if(cnt!=1)
{
cout<<0;
return 0;
}
while(!q.empty())
{
int k=q.front();
q.pop();
for(int i=1;i<=out[k];i++)
{
int t=mp[k][i];
in[t]--;
if(in[t]==0)
{
q.push(t);
cnt++;
ans[cnt]=t+'a'-1;
}
}
}
// for(int i=1;i<=cnt;i++)
// {
// cout<<ans[i];
// }
// cout<<cnt;
// if(cnt==k)
// {cout<<"error"<<endl;
for(int i=0;i<strlen(a);i++)
{
for(int j=1;j<=cnt;j++)
{
if(a[i]==ans[j])
{
cout<<(char)(j+'a'-1);
break;
}
}
}
// }
return 0;
}