题解:POJ1035 Spell checker 【DP】

传送门

对于这个题目,原本打算打AC自动机的,结果看了一眼数据范围,暴力码上去
对于一个串如果进行修改可以变成另外一个串,那么这两个串的长度相差 1,-1,0,然后暴力for过去,判断相同字符数量,暴力比较即可

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define re register
#define gc getchar()
#define ll long long
const int N=10010;
string s1[N],s2[N];

int main() {
	
	freopen("y.txt","r",stdin);
	
	int S1=1,S2=1;
	while(cin>>s1[S1]) {
		if(s1[S1][0]=='#') {--S1;break;}
		++S1;
	}
	while(cin>>s2[S2]) {
		if(s2[S2][0]=='#') {--S2;break;}
		++S2;
	}
	for(int i=1;i<=S2;++i) {
		int flag=0;
		for(int j=1;j<=S1;++j)
			if(s1[j]==s2[i]) {
				cout<<s2[i]<<" is correct"<<endl;
				flag=1;
				break;
			}
		if(flag) continue;
		int l=s2[i].size();
		cout<<s2[i]<<":";
		for(int j=1;j<=S1;++j) {
			int L=s1[j].size();
			if(abs(l-L)<=1) {
				int ans=0;
				if(l>L) {
					for(int k=0,t=0;k<l;++k) {
						if(s2[i][k]==s1[j][t])
							++ans,++t;
					}
				}
				else if(l<L) {
					for(int k=0,t=0;k<L;++k) {
						if(s1[j][k]==s2[i][t])
							++ans,++t;
					}
				}
				else {
					for(int k=0,t=0;k<L;++k,++t) 
						if(s1[j][k]==s2[i][t])
							++ans;
				}
				if(ans==l-(l>=L)) cout<<" "<<s1[j];
			}
		}
		cout<<endl;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43464026/article/details/88238185