我的方法是将题目中给的那个串(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]='