q = int(input()) for i inrange(q): s = input() t = input() n = len(s) m = len(t) ans = False for i inrange(n): for j inrange(0, n - i): k = m - 1 - j if i + j < k: continue l1 = i r = i + j l2 = r - k if s[l1:r+1] + s[l2:r][::-1] == t: ans = True print('YES'if ans else'NO')
for (int i = 1; i <= n; ++i) { scanf("%s", s + 1); int u = 1; for (int j = 1; s[j]; ++j) { int c = s[j] - 'a'; if (!ch[u][c]) ch[u][c] = ++tot; // 如果这个节点的子节点中没有这个字符,添加上并将该字符的节点号记录为++tot u = ch[u][c]; // 往更深一层搜索 } tag[u] = 1; // 最后一个字符为节点 u 的名字未被访问到记录为 1 }
scanf("%d", &m);
while (m--) { scanf("%s", s + 1); int u = 1; for (int j = 1; s[j]; ++j) { int c = s[j] - 'a'; u = ch[u][c]; if (!u) break; // 不存在对应字符的出边说明名字不存在 } if (tag[u] == 1) { tag[u] = 2; // 最后一个字符为节点 u 的名字已经被访问 puts("OK"); } elseif (tag[u] == 2) // 已经被访问,重复访问 puts("REPEAT"); else puts("WRONG"); }
#include<cstdio> #include<iostream> #include<cstring> usingnamespace std; int z[1000010],n,m,r,l; char b[1000010]; int maxn=0; intmain() { scanf("%s",b); m=strlen(b); for (int i=1;i<=m;i++) { if (i>r) { int t=i,bg=0; while (b[t]==b[bg]) t++,bg++; z[i]=bg; r=t-1; l=i; } else { if (z[i-l]<r-i+1) z[i]=z[i-l]; else { int t=r+1,bg=r-i+1; while (b[t]==b[bg]) t++,bg++; z[i]=bg; r=t-1; l=i; } } } int nw=0; for (int i=1;i<m;i++) { if (i+z[i]==m&&nw>=z[i]) maxn=max(maxn,z[i]); nw=max(nw,z[i]); } if (maxn==0) printf("Just a legend"); for (int i=0;i<maxn;i++) printf("%c",b[i]); }
int f[maxn]; string S[4]; int ord[3]={0,1,2}; int ans=maxlongint; //z-algorithm inline string skr(string a,string b) { string T=a+'$'+b;//merge a & b int n=a.length(); int m=b.length(); int Len=n+m+1; f[0]=Len; int j=1,k; for (int i=1;i<Len;i=k) { if (j<i) j=i; while (T[j-i]==T[j] && j<Len) j++; f[i]=j-i; k=i+1; while (k+f[k-i]<j) k++; } int Lim=m+1; for (int i=n+1;i<Len;i++) { if(f[i]==n) return b; if (i+f[i]>=Len){ Lim=min(Lim,i-n);break; } } string cur; cur=b.substr(0,Lim-1)+a; return cur; } //main intmain() { cin>>S[0]>>S[1]>>S[2]; do { ans=min(ans,(int)skr(skr(S[ord[0]],S[ord[1]]),S[ord[2]]).length()); }while (next_permutation(ord,ord+3)); //暴力枚举三个串链接的顺序 cout<<ans<<endl; return0; }
int f[maxn]; string S[4]; int ord[3]={0,1,2}; int ans=maxlongint; inline string skr(string a,string b) { string T=a+'$'+b;//merge a & b int n=a.length(); int m=b.length(); int Len=n+m+1; //int j=-1; f[0]=-1; int j=-1; for(int i=1;i<Len;i++) { while (j!=-1 && T[j+1]!=T[i]) j=f[j]; if(T[i]==T[j+1]) j++; f[i]=j; }//找next数组 for (int i=n+1;i<Len;i++) if (f[i]==n-1) return b;//a是b的子串 string cur=b.substr(0,m-1-f[Len-1])+a;//b减去a的一部分前缀+a return cur; } //main intmain() { cin>>S[0]>>S[1]>>S[2]; do { ans=min(ans,(int)skr(skr(S[ord[0]],S[ord[1]]),S[ord[2]]).length()); }while (next_permutation(ord,ord+3)); //暴力枚举三个串链接的顺序 cout<<ans<<endl; return0; }