【字符串入门专题1】C - A + B for you again hdu1867【kmp】
2017-08-10 09:19
239 查看
Problem Description
Generally speaking, there are a lot of problems about strings processing. Now you encounter another such problem. If you get two strings, such as “asdf” and “sdfg”, the result of the addition between them is “asdfg”, for
“sdf” is the tail substring of “asdf” and the head substring of the “sdfg” . However, the result comes as “asdfghjk”, when you have to add “asdf” and “ghjk” and guarantee the shortest string first, then the minimum lexicographic second, the same rules for
other additions.
Input
For each case, there are two strings (the chars selected just form ‘a’ to ‘z’) for you, and each length of theirs won’t exceed 10^5 and won’t be empty.
Output
Print the ultimate string by the book.
Sample Input
asdf sdfg
asdf ghjk
Sample Output
asdfg
asdfghjk
题意:先按照前后缀长度,再按照字典序,输出两个字符串前缀和后缀最大公共长度。
思路:因为模式串和匹配串并不是固定给出,所以要交换两个字符串的身份调用kmp两次,计算它们的最大前缀和后缀长度k1,k2,当k1和k2相同时,就比较它们的字典序,否则,按匹配过后的顺序输出。
更正:这道题真的很有道理,如果按照我注释掉的代码提交虽然能AC,但是asdfadf 和df数据是不能过滴(代码又被小伙伴出的数据给搞掉了,让我想起了被zzq数据支配的噩梦)
#include<stdio.h>
#include<string.h>
#define N 110000
char s1
,s2
;
int next
;
void get_next(char *b)
{
int j,k;
next[0] = k = -1;
j = 0;
while(b[j]!='\0')
{
if(k==-1||b[j]==b[k])
next[++j] = ++k;
else
k = next[k];
}
return;
}
int kmp(char *a,char *b)
{
int j,i;
get_next(b);
i = j = 0;
while(a[i]!='\0')
{
while(j!=-1&&a[i]!=b[j])
j = next[j];
j++;
i++;
}
return j;
/*while(a[i]!='\0'&&b[j]!='\0')
{
while(j!=-1&&a[i]!=b[j])
j = next[j];
j++;
i++;
}printf("i=%d j=%d\n",i,j);
if(i == strlen(a))
return j;
return 0;*/
}
int main()
{
int k1,k2;
while(scanf("%s",s1)!=EOF)
{
scanf("%s",s2);
k1 = kmp(s1,s2);
k2 = kmp(s2,s1);printf("k1=%d k2=%d\n",k1,k2);
if(k1 == k2)
{
if(strcmp(s1,s2)>0)
{
printf("%s",s2);
printf("%s\n",s1+k1);
}
else
{
printf("%s",s1);
printf("%s\n",s2+k1);
}
}
else if(k1 > k2)
{
printf("%s",s1);
printf("%s\n",s2+k1);
}
else
{
printf("%s",s2);
printf("%s\n",s1+k2);
}
}
return 0;
}
Generally speaking, there are a lot of problems about strings processing. Now you encounter another such problem. If you get two strings, such as “asdf” and “sdfg”, the result of the addition between them is “asdfg”, for
“sdf” is the tail substring of “asdf” and the head substring of the “sdfg” . However, the result comes as “asdfghjk”, when you have to add “asdf” and “ghjk” and guarantee the shortest string first, then the minimum lexicographic second, the same rules for
other additions.
Input
For each case, there are two strings (the chars selected just form ‘a’ to ‘z’) for you, and each length of theirs won’t exceed 10^5 and won’t be empty.
Output
Print the ultimate string by the book.
Sample Input
asdf sdfg
asdf ghjk
Sample Output
asdfg
asdfghjk
题意:先按照前后缀长度,再按照字典序,输出两个字符串前缀和后缀最大公共长度。
思路:因为模式串和匹配串并不是固定给出,所以要交换两个字符串的身份调用kmp两次,计算它们的最大前缀和后缀长度k1,k2,当k1和k2相同时,就比较它们的字典序,否则,按匹配过后的顺序输出。
更正:这道题真的很有道理,如果按照我注释掉的代码提交虽然能AC,但是asdfadf 和df数据是不能过滴(代码又被小伙伴出的数据给搞掉了,让我想起了被zzq数据支配的噩梦)
#include<stdio.h>
#include<string.h>
#define N 110000
char s1
,s2
;
int next
;
void get_next(char *b)
{
int j,k;
next[0] = k = -1;
j = 0;
while(b[j]!='\0')
{
if(k==-1||b[j]==b[k])
next[++j] = ++k;
else
k = next[k];
}
return;
}
int kmp(char *a,char *b)
{
int j,i;
get_next(b);
i = j = 0;
while(a[i]!='\0')
{
while(j!=-1&&a[i]!=b[j])
j = next[j];
j++;
i++;
}
return j;
/*while(a[i]!='\0'&&b[j]!='\0')
{
while(j!=-1&&a[i]!=b[j])
j = next[j];
j++;
i++;
}printf("i=%d j=%d\n",i,j);
if(i == strlen(a))
return j;
return 0;*/
}
int main()
{
int k1,k2;
while(scanf("%s",s1)!=EOF)
{
scanf("%s",s2);
k1 = kmp(s1,s2);
k2 = kmp(s2,s1);printf("k1=%d k2=%d\n",k1,k2);
if(k1 == k2)
{
if(strcmp(s1,s2)>0)
{
printf("%s",s2);
printf("%s\n",s1+k1);
}
else
{
printf("%s",s1);
printf("%s\n",s2+k1);
}
}
else if(k1 > k2)
{
printf("%s",s1);
printf("%s\n",s2+k1);
}
else
{
printf("%s",s2);
printf("%s\n",s1+k2);
}
}
return 0;
}
相关文章推荐
- 【字符串入门专题1】J - Oulipo hdu1686 【kmp】
- 【字符串入门专题1】 E - Cyclic Nacklace hdu3764 【kmp最小循环节应用】
- 【字符串入门专题1】A - 亲和串 hdu 2203 【kmp】
- 【字符串入门专题1】 I - Number Sequence hdu1711【kmp】
- 【字符串入门专题1】D - Period hdu 1358【kmp-最小循环节简单应用】
- 【字符串入门专题1】F - Seek the Name, Seek the Fame poj2752【kmp】
- 字符串专题:G - Milking Grid (二维kmp)
- 【字符串入门专题1】【hdu4763】【未ac题】【扩展kmp exkmp】
- hdu 1711 kuangbin 字符串 A KMP入门
- 字符串 KMP入门,讲解
- 【字符串入门专题1】hdu3613 【一个悲伤的exkmp】
- kuangbin kmp专题中的字符串暴力
- 字符串专题 kmp-trie-ac
- 字符串专题:KMP POJ 3561
- 字符串专题(trie,KMP,AC自动机,manacher)
- 字符串专题:F - Oulipo (A包含多少次B?KMP)
- hdu 3746 kmp求字符串循环节
- Python入门教程完整版(懂中文就能学会)视频\02python基础\day05\189-字符串-05-判断数字的三个方法.py
- KMP字符串查找算法
- kmp--nkoj2202字符串乘方