悲剧,,已经记不清写这道题写了几天了,,,,总之就是一直不断的wr,,,然后一直不断的找漏洞,,,,刚才才明白,,原来调用KMP函数时,,j的值就是匹配的长度,,,而我之前却在绞尽脑汁的想这么求匹配的长度。。。。。。。这让我情何以堪!!!!!!!!!!用两次KMP,比较一下两次匹配长度即可。题目:
A + B for you again
Time Limit: 5000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1336Accepted Submission(s): 288
#include <iostream>
#include <string.h>
#include <cstdio>
const int N=100010;
int nextt[N];
using namespace std;
void get_next(char s[])
{
int i=1,j=0;
int len=strlen(s);
nextt[0]=-1;
while(i<len){
if(j==-1||s[i]==s[j]){
++i;++j;nextt[i]=j;
}
else
j=nextt[j];
}
}
int kmp(char ss[],char s[]){
int len1=strlen(ss);
int len2=strlen(s);
get_next(s);
int i=0,j=0;
while(i<len1&&j<len2){
if(j==-1||ss[i]==s[j]){
++i;++j;
}
else
j=nextt[j];
}
if(i==len1)
return j;
else
return 0;
}
int main(){
//freopen("1.txt","r",stdin);
char str1[N],str2[N];
while(scanf("%s%s",str1,str2)!=EOF){
int x=kmp(str1,str2);
int y=kmp(str2,str1);
//printf("x==%d y==%d\n",x,y);
if(x==y){
if(strcmp(str1,str2)>0){
printf("%s",str2);
printf("%s\n",str1+x);
}
else{
printf("%s",str1);
printf("%s\n",str2+x);
}
}
else if(x>y){
printf("%s",str1);
printf("%s\n",str2+x);
}
else{
printf("%s",str2);
printf("%s\n",str1+y);
}
}
return 0;
}
本文详细解析了字符串加法问题及其与KMP算法的结合应用,通过实例展示了如何利用KMP函数解决特定字符串操作问题,并提供了AC代码实现。
1282

被折叠的 条评论
为什么被折叠?



