hdu2594
翻译:编写一个程序,当给定字符串S1和S2时,该程序查找最长的S1前缀,该前缀为S2的后缀。
首先,我们可以想到,查找两个字符串的前后缀太麻烦。
|(____)___________| s1
|___(____)| s2
当s1的前缀与s2的后缀相同时,我们把s1和s2加起来得到
|(___)______________(___)|
于是,题目就转换成了,求字符串的前后缀最长匹配(kmp中的next数组)。
代码
#include<bits/stdc++.h> using namespace std; string pat,s1,s2; int nxt[100005]; void getNext(int lengthP) { int j=0,k=-1; nxt[0]=-1; while(j<lengthP) { if(k==-1||pat[j]==pat[k]) j++,k++,nxt[j]=k; else k=nxt[k]; } } //求next int main() { while(cin>>s1>>s2) { pat=s1+s2; int l1=s1.length(),l2=s2.length(); int len=pat.length(); getNext(len); nxt[len]=min(nxt[len],min(l1,l2)); for(int i=0;i<nxt[len];i++)cout<<pat[i]; if(nxt[len])cout<<' '; cout<<nxt[len]<<endl;//打印 } return 0; }
Exp:当给定字符串S1和S2时,该程序查找最长的S1前缀,该前缀为S2的后缀的逆序。
同样还是这个思想
|(______)____________| s1
|____(_______)| s2
我们把s2加在s1前,得到
|____(_______)(_______)____________| s1+s2
求最长回文子串,用manacher就可以实现了
完结撒花