【字符串处理】poj1035
2015-04-22 10:18
211 查看
本身是个一眼能看出算法的水题,但是实现还是出了很多问题。
一开始枚举的太奔放。。直接T掉
然后脑抽在了一个地方:其实只要在第一个不同的位置添加或者删除就可以
最近的状态也是非常差,水题都做的艰辛,insert和delete借鉴了小优前辈的写法。
一开始枚举的太奔放。。直接T掉
然后脑抽在了一个地方:其实只要在第一个不同的位置添加或者删除就可以
最近的状态也是非常差,水题都做的艰辛,insert和delete借鉴了小优前辈的写法。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<vector> /*先check正确性,然后考虑增加,删减,和变换一个字符*/ char s[4][50010][51]; int tot[4]; bool flag[50010]; char std_ch[51]="#"; using namespace std; void Input(int x) { for (;;) { tot[x]++; scanf("%s",s[x][tot[x]]); if (strcmp(s[x][tot[x]],std_ch)==0) break; } tot[x]--; } void work_change(int x,int y) { int len1=strlen(s[2][x]); int len2=strlen(s[1][y]); int tmp=0; for (int i=0;i<max(len1,len2);i++) if (s[1][y][i]!=s[2][x][i]) { tmp++; if (tmp>1) return; } flag[y]=true; } void work_insert(int x,int y) { int len1=strlen(s[2][x]); int len2=strlen(s[1][y]); if (len2-len1!=1) return; int head1=0,head2=0,tot_tmp=0; while (head1<len1&&head2<len2) { if (s[2][x][head1]!=s[1][y][head2]) { head2++; tot_tmp++; if (tot_tmp>1) return; } else { head1++,head2++; } } flag[y]=true; } void work_delete(int x,int y) { int len1=strlen(s[1][y]); int len2=strlen(s[2][x]); int head1=0,head2=0,tot_tmp=0; if (len2-len1!=1) return; while (head1<len1&&head2<len2) { if (s[1][y][head1]!=s[2][x][head2]) { head2++; tot_tmp++; if (tot_tmp>1) return; } else { head1++; head2++; } } flag[y]=true; } bool check(int x) { for (int i=1;i<=tot[1];i++) if (strcmp(s[1][i],s[2][x])==0) return true; return false; } int main() { freopen("poj1035.in","r",stdin); freopen("poj1035.out","w",stdout); memset(flag,0,sizeof(flag)); Input(1); Input(2); for (int i=1;i<=tot[2];i++) { if (check(i)) { memset(flag,0,sizeof(flag)); printf("%s is correct\n",s[2][i]); continue; } else { int len1,len2; printf("%s:",s[2][i]); for (int j=1;j<=tot[1];j++) { work_delete(i,j); if (flag[j]==true) { printf(" %s",s[1][j]); flag[j]=false; continue; } work_insert(i,j); if (flag[j]==true) { printf(" %s",s[1][j]); flag[j]=false; continue; } work_change(i,j); if (flag[j]==true) { printf(" %s",s[1][j]); flag[j]=false; continue; } } if (i<tot[2]) printf("\n"); } } return 0; }
相关文章推荐
- POJ 1035 Spell checker【字符串处理】
- poj 1035 Spell checker ( 字符串处理 )
- poj 1035 字符串处理
- POJ1035——Spell checker(字符串处理)
- POJ 1035 Spell checker(字符串处理)
- POJ 1035 Spell checker【字符串暴力处理】
- poj_1035 Spell checker(字符串处理)
- POJ Spell checker(1035)-字符串处理
- poj 1035 Spell checker ( 字符串处理 )
- POJ 1035 Spell Check 字符串处理
- poj 1035 Spell checker(字符串处理)
- POJ 1016(自总结数 字符串处理) 解题报告
- 字符串处理,Poj(2121)
- POJ 1035 Spell checker 字符串暴力
- poj 2334 Simple prefix compression(模拟/字符串处理)
- POJ--1690 (Your)((Term)((Project)))(字符串处理)
- poj 2263 Heavy Cargo floyd基础,就是输入的时候处理字符串纠结一点!!!!
- POJ3096字符串处理
- POJ 1016(自总结数 字符串处理) 解题报告
- (字符串的处理方式4.7.15)POJ 1080 Human Gene Functions(两个字符串的最佳匹配)