hdu 1686 Oulipo

1200 단어
클릭하여 링크 열기 hdu 1686
사고방식: KMP분석: 1문제는 하나의 모델에 대해 하나의 텍스트 열을 매겨서 텍스트 열에 두 번의 전형적인 KMP 문제가 발생하는 것을 구하는 것이다. 템플릿을 씌우기만 하면 된다.코드:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

#define MAXN 1000010

int t , ans;
char text[MAXN];
char pattern[MAXN];
int next[MAXN];

/*    next  */
void getNext(){
   int m = strlen(pattern);
   next[0] = next[1] = 0;
   for(int i = 1 ; i < m ; i++){/*    1  */
      int j = next[i];
      while(j && pattern[i] != pattern[j])
          j = next[j];
      next[i+1] = pattern[i] == pattern[j] ? j+1 : 0;
   }
}

/*     */
void find(){
   ans = 0;
   int n = strlen(text);
   int m = strlen(pattern);
   int j = 0;/*      */
   for(int i = 0 ; i < n ; i++){
      while(j && pattern[j] != text[i])
          j = next[j];
      if(pattern[j] == text[i])
         j++;
      if(j == m)
        ans++;/*      ans*/
   }
   printf("%d
" , ans); } int main(){ scanf("%d" , &t); while(t--){ scanf("%s" , pattern); scanf("%s" , text); getNext(); find(); } return 0; }

좋은 웹페이지 즐겨찾기