标签:
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2594
题目:
思路:渣渣我一开始写的是kmp的,后来嫌麻烦,就直接写了个暴力,,然后1a了,还是390MS。。(还是暴力大法好,虽然很可能会T,但在比赛时你没其他思路时,不妨来一发,万一AC了呢?缘分这种事谁说的清呢?手动 脸红.jpg)
弱弱的说句:数据真弱
等下补上kmp的做法==
#include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; typedef long long LL; typedef pair<int,int> PII; #define PI acos((double)-1) #define E exp(double(1)) #define K 1000000+9 int nt[K]; string sa,sb; int solve(void) { int mx=0; for(int i=0,len=min(sa.length(),sb.length());i<len;i++) if(sa.compare(0,i+1,sb,sb.length()-i-1,i+1)==0) mx=max(mx,i+1); return mx; } int main(void) { while(cin>>sa>>sb) { int k=solve(); if(k) { for(int i=0;i<k;i++) printf("%c",sa[i]); printf(" %d\n",k); } else printf("0\n"); } return 0; }
kmp:看到前缀和后缀的匹配肯定是kmp啊,把sb加在sa后面求个next数组就可以了==
不过当next[sa.length()-1]>min(sa.length(),sb.length())时(第一个sa是拼接后的字符串,后两个是原字符串)。
要不短回退至适配位置.
具体见代码:
#include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; typedef long long LL; typedef pair<int,int> PII; #define PI acos((double)-1) #define E exp(double(1)) #define K 1000000+9 int nt[K]; string sa,sb; void kmp_next(void) { nt[0]=0; for(int i=1,j=0,len=sa.length();i<len;i++) { while(j&&sa[i]!=sa[j])j=nt[j-1]; if(sa[i]==sa[j])j++; nt[i]=j; } } int main(void) { while(cin>>sa>>sb) { int len=min(sa.length(),sb.length()); sa+=sb; kmp_next(); int k=nt[sa.length()-1]; while(k>len)k=nt[k-1]; if(k) { for(int i=0;i<k;i++) printf("%c",sa[i]); printf(" %d\n",k); } else printf("0\n"); } return 0; }
hdu 2594 Simpsons’ Hidden Talents
标签:
原文地址:http://www.cnblogs.com/weeping/p/5735081.html