HDU 4300 Clairewd’s message KMP
2305 단어 KMP
이 문제 의 제 의 는 너무 이해 하기 어렵다.
첫 번 째 줄 에서 26 자 모 를 주 는 비밀문 입 니 다.대응 명문 은 a-z 입 니 다.
두 번 째 줄 은 당신 에 게 앞 에는 비밀문 이 있 고 뒤 에는 명문 의 문자열 이 있 습 니 다.비밀문 은 반드시 완전 할 것 입 니 다.그러나 명문 은 없 을 수도 있 고 다 있 을 수도 있 습 니 다.
가장 짧 은 밀 문+명문 을 구하 라 고.
abcdab
최 단 비밀문서:abcd,대응 하 는 명문 은 abcd 입 니 다.
그래서 최 단 비밀문서+명문 abcdabcd
예 2:qwertabcde
최 단 비밀문서:qwert,대응 하 는 명문 은 abcde 입 니 다.
그래서 최 단 밀 문+명문 은 qwertabcde
이해 가 안 돼.
사고:명문 의 길 이 는 반드시 len/2 보다 작 을 것 이다.그리고 뒤의 절반 으로 대응 하 는 명문 과 일치 할 것 이다.
예 를 들 어 첫 번 째 예:dab 와 abcdab 의 최대 일치 가 t=2 인 것 은 두 개가 명문 이 고 t 에서 len-t 출력 뒤에 있 는 것 은 표시 되 지 않 은 명문 임 을 나타 낸다.
AC 코드:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std;
typedef __int64 LL;
const int N=100090;
const LL II=1000000007;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
char word[N],yi[26],mi[26],xh[N];
int wlen,next[N];
void getnext(char *p)
{
int j=0,k=-1;
next[0]=-1;
while(j<wlen)
{
if(k==-1||p[j]==p[k])
{
j++; k++;
next[j]=k;
}
else
k=next[k];
}
}
int kmp(char *text,char *word)
{
int i=0,j=0,tlen=strlen(text);
while(i<tlen)
{
if(j==-1||text[i]==word[j])
j++,i++;
else
j=next[j];
}
return j;//
}
int main()
{
int i,j,T;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",yi,word);
printf("%s",word);
for(i=0;i<26;i++)
mi[yi[i]-'a']=i+'a';//
wlen=strlen(word);
strcpy(xh,word+(wlen+1)/2);
for(i=0;i<wlen;i++)
word[i]=mi[word[i]-'a'];
getnext(word);
int t=kmp(xh,word);//
int p=wlen-t;//
word[p]='\0';
printf("%s
",word+t);// t p
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
알고리즘 - Knuth, Morris, Prett흔히 찾는 문자나 문자열이 있는 지 없는 지를 확인할 때는 주로 if pattern in words 이런 식으로 검사를 할 수 있다. pi 테이블은 찾으려는 문자열(pattern)의 정보를 저장하고 있는 배열, 자료...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.