Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had.
Input Input consists of two lines. The first line contains s1 and the second line contains s2. You may assume all letters are in lowercase.
Output Output consists of a single line that contains the longest string that is a prefix of s1 and a suffix of s2, followed by the length of that prefix. If the longest such string is the empty string, then the output should be 0.
Sample Input clinton homer riemann marjorie
Sample Output 0 rie 3
Source HDU 2010-05 Programming Contest
Recommend lcy | We have carefully selected several similar problems for you: 1686 2595 2596 2597 2598
|
哈哈哈哈,终于自己做出了算法题了。
直接把这两个字符串合并起来就行,但有一点要注意就是比如
abc abcabc
abcabc 6
所以应该限制一下长度,不能超过原本字符串的长度
但是,发现了一组数据不对,但其他做法也不对,
abc dabcd 这个应该输出0 结果是输出abc 3
后面代码可以解决此错误。
数据水啊
代码实现:能AC但最后一个样例没过
#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
const int N = 1000002;
int nxt[N];
string S,T,T1;
int tlen;
void getNext()
{
int j, k;
j = 0; k = -1;
nxt[0] = -1;
while(j < tlen)
if(k == -1 || T[j] == T[k])
{
nxt[++j] = ++k;
if (T[j] != T[k])
nxt[j] = k;
}
else
k = nxt[k];
}
int main()
{
while(cin>>T1>>S)
{
T=T1+S;
tlen= T.length();
getNext();
if(nxt[tlen]==0)
{
printf("0\n") ;
continue;
}
int ans=min(T1.length(),S.length());
if(nxt[tlen]<=T1.length()&&nxt[tlen]<=S.length())
ans=nxt[tlen];
cout<<T.substr(0,ans)<<" "<<ans<<endl;
}
return 0;
}
可以过最后一个样例
#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
const int N = 1000002;
int nxt[N];
string S,T,T1;
int tlen;
void getNext()
{
int j, k;
j = 0; k = -1;
nxt[0] = -1;
while(j < tlen)
if(k == -1 || T[j] == T[k])
{
nxt[++j] = ++k;
if (T[j] != T[k])
nxt[j] = k;
}
else
k = nxt[k];
}
int main()
{
while(cin>>T1>>S)
{
T=T1+S;
tlen= T.length();
getNext();
int minn=min(T1.length(),S.length());
int index=nxt[tlen];
while (index>minn)//若超出长度
index=nxt[index];//向前迭代寻找
if(index==0)
{
printf("0\n") ;
continue;
}
cout<<T.substr(0,index)<<" "<<index<<endl;
}
return 0;
}