本来就是简单的字符串问题,模拟比较一下就可以,结果因为一个标志位写错调试了20多分钟。。。
code
#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <limits>
#include <vector>
#include <bitset>
#include <string>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <string.h>
#include <iostream>
#include <algorithm>
#define ls rt<<1
#define rs rt<<1|1
#define Si set<int>
#define LL long long
#define pb push_back
#define PS printf(" ")
#define Vi vector<int>
#define LN printf("\n")
#define SD(a) scanf("%d",&a)
#define PD(a) printf("%d",a)
#define SET(a,b) memset(a,b,sizeof(a))
#define FF(i,a) for(int i(0);i<(a);i++)
#define FD(i,a) for(int i(a);i>=(1);i--)
#define FOR(i,a,b) for(int i(a);i<=(b);i++)
#define FOD(i,a,b) for(int i(a);i>=(b);i--)
#define readf freopen("input.txt","r",stdin)
#define writef freopen("output.txt","w",stdout)
const int maxn = 10001;
const int INF = 0x3fffffff;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const double pi = acos(-1.0);
using namespace std;
char dict[10001][16];
char check[51][16];
int dlen[10001],clen[51];
int path[10001];
bool replace(int cn,int dn){
int cnt=0;
FF(i,dlen[dn]){
if(check[cn][i]!=dict[dn][i]) cnt++;
if(cnt>1) return false;
}
return true;
}
bool del(int cn,int dn){
int i,j,cnt;
i=j=cnt=0;
while(j<dlen[dn]){
if(check[cn][i]!=dict[dn][j]){
i++;
cnt++;
if(cnt>1) return false;
}else{
i++;
j++;
}
}
return true;
}
bool insert(int cn,int dn){
int i,j,cnt;
i=j=cnt=0;
//printf("clen %d\n",clen[cn]);
while(i<clen[cn]){
//printf(" %c %c \n",check[cn][i],dict[dn][j]);
if(check[cn][i]!=dict[dn][j]){
j++;cnt++;
//PD(cnt);LN;
if(cnt>1) return false;
}else{
i++;
j++;
}
}
return true;
}
int main(){
//readf;
char tmp[16];
int N=0,M=0;
while(~scanf("%s",tmp)&&tmp[0]!='#'){
strcpy(dict[++N],tmp);
}
while(~scanf("%s",tmp)&&tmp[0]!='#'){
strcpy(check[++M],tmp);
}
FOR(i,1,N) dlen[i]=strlen(dict[i]);
FOR(i,1,M) clen[i]=strlen(check[i]);
//printf("%d\n",insert(3,6));
int pos=0;
FOR(i,1,M){
bool flag=false;
pos=0;
FOR(j,1,N){
if(clen[i]==dlen[j]){
if(!strcmp(check[i],dict[j])){
flag=true;
break;
}else{
if(replace(i,j)) path[++pos]=j;
}
}
if(clen[i]+1==dlen[j]){
if(insert(i,j)) path[++pos]=j;
}
if(clen[i]==dlen[j]+1){
if(del(i,j)) path[++pos]=j;
}
}
if(flag) printf("%s is correct\n",check[i]);
else{
printf("%s:",check[i]);
FOR(j,1,pos){
printf(" %s",dict[path[j]]);
}
LN;
}
}
return 0;
}
分享到:
相关推荐
北大POJ1035-Spell checker 解题报告+AC代码
北大ACP-POJ 1035 - Spell checker 原比赛题目测试数据(问题G)
poj 3435 Sudoku Checker.md
总结了多位大神的解题技巧并分享. 运用了模拟法,多种解题思路,都通过了ACM网址的提交Accept。
北大POJ2586-Y2K Accounting Bug 解题报告+AC代码
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
北大POJ1159-Palindrome 解题报告+AC代码
poj分类poj分类poj分类poj分类
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
北大POJ2002-Squares 解题报告+AC代码
POJ1048,加强版的约瑟夫问题 难度中等
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 百练 题目分类 poj 百练 题目分类