Description
Input
Output
Sample Input
die einkommen der landwirte sind fuer die abgeordneten ein buch mit sieben siegeln um dem abzuhelfen muessen dringend alle subventionsgesetze verbessert werden # die steuern auf vermoegen und einkommen sollten nach meinung der abgeordneten nachdruecklich erhoben werden dazu muessen die kontrollbefugnisse der finanzbehoerden dringend verbessert werden #
Sample Output
die einkommen der abgeordneten muessen dringend verbessert werden
题意:给出两段文字,求出最长的公共单词串
思路:LCS问题,只需要开个二维来记录就好了
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char a[35][105],b[35][105],c[35][105]; int dp[105][105],mark[105][105],len1,len2,cnt; void LCS() { int i,j; memset(dp,0,sizeof(dp)); memset(mark,0,sizeof(mark)); for(i = 0;i<=len1;i++) mark[i][0] = 1; for(i = 0;i<=len2;i++) mark[0][i] = -1; for(i = 1; i<=len1; i++) { for(j = 1; j<=len2; j++) { if(!strcmp(a[i-1],b[j-1])) { dp[i][j] = dp[i-1][j-1]+1; mark[i][j] = 0; } else if(dp[i-1][j]>=dp[i][j-1]) { dp[i][j] = dp[i-1][j]; mark[i][j] = 1; } else { dp[i][j] = dp[i][j-1]; mark[i][j] = -1; } } } } void PrintLCS(int i,int j) { if(!i&&!j) return ; if(mark[i][j]==0) { PrintLCS(i-1,j-1); strcpy(c[cnt++],a[i-1]); } else if(mark[i][j]==1) { PrintLCS(i-1,j); } else { PrintLCS(i,j-1); } } int main() { int i; while(~scanf("%s",a[0])) { len1 = 1; while(strcmp(a[len1-1],"#")) scanf("%s",a[len1++]); len1-=1; scanf("%s",b[0]); len2 = 1; while(strcmp(b[len2-1],"#")) scanf("%s",b[len2++]); LCS(); cnt = 0; PrintLCS(len1,len2); printf("%s",c[0]); for(i = 1; i<cnt; i++) { printf(" %s",c[i]); } printf("\n"); } return 0; }