RE On #6 #9。
显示:
Runtime Error.
Received signal 6: Aborted / IOT trap.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int head[100005],G_cnt;
struct data{
int to;
int next;
};
data edge[100005];
int degree[100005];
void add_edge(int from,int to) {
G_cnt++;
edge[G_cnt].to=to;
edge[G_cnt].next=head[from];
degree[to]++;
head[from]=G_cnt;
return;
}
struct node{
int x1;
int y1;
int x2;
int y2;
int ltr;
};
int cnt;
node pos[30000];
int n,m;
char a[305][305];
int b[30000];
vector<string> ans;
string s;
string kkkkk;
bool vis[100005];
string tran(string p) {
string ans="";
for(int i=0;i<p.size();i++) {
ans[p.size()-i-1]=p[i];
}
string k;
for(int i=0;i<p.size();i++) {
k+=ans[i];
}
return k;
}
void toposort(int x) {
if(x>cnt) {
string p=kkkkk;
for(int i=1;i<x;i++) {
p+=s[i];
}
ans.push_back(tran(p));
return;
}
//cout<<x<<" ";
for(int i=1;i<=cnt;i++) {
int v=pos[i].ltr;
if(!vis[v] && degree[v]==0) {
vis[v]=true;
for(int j=head[v];j;j=edge[j].next) {
degree[edge[j].to]--;
}
s[x]=char(pos[i].ltr+'A'-1);
toposort(x+1);
vis[v]=false;
for(int j=head[v];j;j=edge[j].next) {
degree[edge[j].to]++;
}
}
}
return;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
cin>>a[i][j];
b[a[i][j]-'A'+1]++;
}
}
for(int p=1;p<=26;p++) {
if(b[p]) {
bool flag=false;
cnt++;
pos[cnt].ltr=p;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if((a[i][j]-'A'+1)==p) {
if(!flag) {
pos[cnt].x1=i;
flag=true;
}
pos[cnt].x2=i;
}
}
}
flag=false;
for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++) {
if((a[j][i]-'A'+1)==p) {
if(!flag) {
pos[cnt].y1=i;
flag=true;
}
pos[cnt].y2=i;
}
}
}
}
}
for(int k=1;k<=cnt;k++) {
for(int i=pos[k].y1;i<=pos[k].y2;i++) {
if(pos[k].ltr^(a[pos[k].x1][i]-'A'+1) && a[pos[k].x1][i]!='.') {
add_edge(a[pos[k].x1][i]-'A'+1,pos[k].ltr);
//cout<<a[pos[k].x1][i]-'A'+1<<" "<<pos[k].ltr<<endl;
}
if(pos[k].ltr^(a[pos[k].x2][i]-'A'+1) && a[pos[k].x2][i]!='.') {
add_edge(a[pos[k].x2][i]-'A'+1,pos[k].ltr);
//cout<<a[pos[k].x2][i]-'A'+1<<" "<<pos[k].ltr<<endl;
}
}
for(int i=pos[k].x1;i<=pos[k].x2;i++) {
if(pos[k].ltr^(a[i][pos[k].y1]-'A'+1) && a[i][pos[k].y1]!='.') {
add_edge(a[i][pos[k].y1]-'A'+1,pos[k].ltr);
//cout<<a[i][pos[k].y1]-'A'+1<<" "<<pos[k].ltr<<endl;
}
if(pos[k].ltr^(a[i][pos[k].y2]-'A'+1) && a[i][pos[k].y2]!='.') {
add_edge(a[i][pos[k].y2]-'A'+1,pos[k].ltr);
//cout<<a[i][pos[k].y2]-'A'+1<<" "<<pos[k].ltr<<endl;
}
}
}
toposort(1);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) {
cout<<ans[i];
cout<<endl;
}
return 0;
}
求条。