我的方法是将题目中给的那个串(anniversary)拆分成三段。枚举所有情况,也就100多种的样子。
每一种情况去判断在输入的串中能不能找到这三个串,并且不相交。
o(︶︿︶)o 唉,思路很快就有了,代码写得丑,找错找了半天,最终在场外Submit的1A了。
写题时候脑瘫,还搞了个KMP上去。。。其实长度为100的串,暴力和KMP差距并不是很大,似乎都能 0ms AC。
按照自己的思路来能过这题,已经很满足了。。。
#include#include #include #include 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