親和串 HDU - 2203 (KMP 迴圈移位一個串去匹配)
阿新 • • 發佈:2018-11-06
題意:
判斷P串是不是能和T串迴圈移位K位後的字串有匹配點
分析:
把T往自身後面貼一下變成TT,然後看P在TT中有沒有匹配點即可~~~
這種往後帖一下的思想可以說是一種技巧,比如:求陣列挖去連續一塊後求剩下的有多少個不同的數.
#include<bits/stdc++.h> using namespace std; const int maxn = 100000+111; char s[maxn+maxn],p[maxn]; int n,m,f[maxn]; void getfail() { f[0]=f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j && p[j]!=p[i])j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; } } bool kmp() { if(n<m)return false; int j=0; for(int i=0;i<n+n;i++) { while(j && s[i]!=p[j])j=f[j]; if(s[i]==p[j])j++; if(j==m)return true; } return false; } int main() { while(scanf("%s%s",s,p)!=EOF) { n=strlen(s); m=strlen(p); for(int i=n;i<2*n;i++) { s[i]=s[i-n]; } s[2*n]=0; if(kmp())puts("yes"); else puts("no"); } }