標籤:
我的方法是將題目中給的那個串(anniversary)拆分成三段。枚舉所有情況,也就100多種的樣子。
每一種情況去判斷在輸入的串中能不能找到這三個串,並且不相交。
o(︶︿︶)o 唉,思路很快就有了,代碼寫得醜,找錯找了半天,最終在場外Submit的1A了。
寫題時候腦癱,還搞了個KMP上去。。。其實長度為100的串,暴力和KMP差距並不是很大,似乎都能 0ms AC。
按照自己的思路來能過這題,已經很滿足了。。。
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;char s[1000];char y[100]="anniversary";char one[100],two[100],three[100];char R[1000];const int N = 1000002;int Next[N];char S[N], T[N];int slen, tlen;int tot;int flag;int lenZ;void getNext(){ int j, k; j = 0; k = -1; Next[0] = -1; while(j < tlen) if(k == -1 || T[j] == T[k]) Next[++j] = ++k; else k = Next[k];}int KMP_Index(){ int i = 0, j = 0; getNext(); while(i < slen && j < tlen) { if(j == -1 || S[i] == T[j]) { i++; j++; } else j = Next[j]; } if(j == tlen) return i - tlen; else return -1;}int main(){ int TT; int i,j,k; scanf("%d",&TT); while(TT--) { scanf("%s",s); strcpy(R,s); lenZ=strlen(s); flag=0; int i,j; for(i=1;i<=10;i++) { for(j=i;j<=9;j++) { strcpy(s,R); int u=0; for(k=0;k<=i-1;k++) one[u]=y[k],u++; one[u]=‘\0‘; u=0; for(k=i;k<=j;k++) two[u]=y[k],u++; two[u]=‘\0‘; u=0; for(k=j+1;k<11;k++) three[u]=y[k],u++; three[u]=‘\0‘; u=0; //printf("%s %s %s\n",one,two,three); if(i==1&&j==2) { strcpy(one,"anniv"); strcpy(two,"ers"); strcpy(three,"ary"); } int lenone=strlen(one); int lentwo=strlen(two); int lenthree=strlen(three); strcpy(S,s); strcpy(T,one); slen = strlen(S); tlen = strlen(T); int oneshou=KMP_Index(); int ii; if(oneshou!=-1) { S[0]=0; tot=0; lenZ=strlen(s); for(ii=oneshou+lenone;ii<lenZ;ii++) S[tot]=s[ii],tot++; S[tot]=‘\0‘; strcpy(T,two); slen = strlen(S); tlen = strlen(T); int twoshou=KMP_Index(); if(twoshou!=-1) { strcpy(s,S); lenZ=strlen(S); tot=0; S[0]=0; for(ii=twoshou+lentwo;ii<lenZ;ii++) S[tot]=s[ii],tot++; S[tot]=‘\0‘; strcpy(T,three); slen = strlen(S); tlen = strlen(T); if(KMP_Index()!=-1) flag=1; } } if(flag) break; } if(flag) break; } if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}
HDU 5311 Hidden String