uva 843

来源:互联网 发布:fastdfs windows 部署 编辑:程序博客网 时间:2024/06/15 19:13

终于解出来了
stl会比较慢

直接c做可以更快一点

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include<cstring>
using namespace std;


int n,words,nwords;
char dict[1020][20];
char cry[100][100];
char copys[100][100];
char all[30];
bool finished;
int steps=0;
int err;
bool conflict(){
char t[30];
for(int i=0;i<26;i++){
t[i]=all[i];
}
sort(t,t+26);
for(int i=1;i<26;i++){
if(t[i]!='*'&&t[i-1]!='*'&&t[i]==t[i-1]){
return true;
}
}
return false;
}
void dfs(int k){
steps++;
if(k==nwords){
if(!conflict())
finished=true;
return;
}
char temp[30];
for(int i=0;i<26;i++){
temp[i]=all[i];
}
for(int i=0;i<n&&!finished;i++){
if(strlen(cry[k])==strlen(dict[i])){
int is=1;
for(int j=0;j<strlen(cry[k]);j++){
if(all[dict[i][j]-'a']!='*'&&all[dict[i][j]-'a']!=cry[k][j]){
is=0;
break;
}
else if(all[dict[i][j]-'a']=='*'){
all[dict[i][j]-'a']=cry[k][j];
}
}


if(is){
/* for(int j=0;j<strlen(cry[k]);j++){
all[dict[i][j]-'a']=cry[k][j];
}
*/ if(!conflict())
dfs(k+1);
if(!finished)
for(int i=0;i<26;i++){
all[i]=temp[i];
}
else{
return;
}
}
for(int i=0;i<26;i++){
all[i]=temp[i];
}
}
}
}
bool obj(int k){
int i,j;
int has=0;
char temp[30];
for(i=0;i<n;i++){//一个单词 出现两个相同字母 映射又不相同 返回错误 
for(j=0;j<26;j++){
temp[j]='*';
}
if(strlen(cry[k])==strlen(dict[i])){
int ok=1;
for(j=0;j<strlen(cry[k]);j++){
if(temp[cry[k][j]-'a']=='*')
temp[cry[k][j]-'a']=dict[i][j];
else{
if(temp[cry[k][j]-'a']!=dict[i][j]){
ok=0;
break;
}
}
}
if(ok){
has=1;
break;
}
}
}
if(!has){
return true;
}
return false;
}
int cmp(const void  *a,const void *b){
return strcmp((char *)a,(char * )b);
}
int main(){
#ifdef DEBUG
freopen("4.txt","r",stdin);
#endif
cin>>n;
int i,j,k,has;//读字典 避免重复 
for(i=0;i<n;i++){
cin>>dict[i];
if(i-1>=0&&strlen(dict[i])==strlen(dict[i-1])){
has=0;
for(j=0;j<strlen(dict[i]);j++){
if(dict[i][j]!=dict[i-1][j]){
has=1;
break;
}
}
if(!has){
i--;
n--;
}
}
}
char c;
words=0;
memset(cry,0,sizeof(cry));
cin.ignore();
char line[100];
while(gets(line)){//读每一行的每一个词 
err=0;
steps=0;
istringstream iss(line);
for(i=0;i<26;i++){
all[i]='*';
}
iss>>cry[0];
memset(copys,0,sizeof(copys));

words=1;
if(c!='\n')
while(iss>>cry[words]){
words++;
i++;
// words++;
}
/* if(words!=1&&c=='\n'){
words++;
}
*/ memcpy(copys,cry,sizeof(cry));
qsort(cry,words,sizeof(cry[0]),cmp);//排序 删除 重复 备份 
j=0; 
for(i=1;i<words;i++){
if(strcmp(cry[i],cry[i-1])){
j++;
for(k=0;k<=strlen(cry[i]);k++ ){
cry[j][k]=cry[i][k];
}


}
}
nwords=j+1;



finished=false;
int ok=1;
/* for(i=0;i<nwords;i++){//出现长度不符的 退出 
int has=0;
for(j=0;j<n;j++){
if(strlen(cry[i])==strlen(dict[j])){
has=1;
break;
}
}
if(!has){
ok=0;
break;
}
}
int can=1;
for(i=0;i<nwords;i++){
if(obj(i)){   //有一个映射到多个的 
can=0;
}
}
*/
if(nwords<=n)
dfs(0);


if(finished){  // 输出 
/* for(i=0;i<strlen(copys[0]);i++){
for(j=0;j<26;j++){
if(all[j]==copys[0][i]){
cout<<char(j+'a');
}
}
}
for(i=1;i<words;i++){
cout<<' ';
for(j=0;j<strlen(copys[i]);j++){
for(k=0;k<26;k++){
if(all[k]==copys[i][j]){
cout<<char(k+'a');
}
}
}
}*/
for(i=0;i<strlen(line);i++){
if(line[i]==' '){
cout<<' ';
}
else{
for(k=0;k<26;k++){
if(all[k]==line[i]){
cout<<char(k+'a');
}
}
}
}
puts("");
}
else{
/* int len= strlen(copys[0]);
for(i=0;i<len;i++){
cout<<'*';
}
for(i=1;i<words;i++){
cout<<' ';
len=strlen(copys[i]);
for(j=0;j<len;j++){
cout<<'*';
}
}
*/

for(i=0;i<strlen(line);i++){
if(line[i]==' '){
cout<<' ';
}
else{
cout<<"*";
}
}
puts("");
}
memset(cry,0,sizeof(cry));
}
return 0;
}

原创粉丝点击