BZOJ1258: [CQOI2007]三角形tri
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1258
如果最后一位是4,那就改成123就好了。
然后最后一位不是4的话,至多三个答案,然后可以发现把给的串最后一个改成4的一定会有。然后可以发现1继承其祖先12的,2继承13的,3继承23的,然后扫一遍。。
(口胡了这么多还是自己找找规律吧TAT
#include<cstring> #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #define rep(i,l,r) for (int i=l;i<=r;i++) #define down(i,l,r) for (int i=l;i>=r;i--) #define clr(x,y) memset(x,y,sizeof(x)) #define maxn 2000 using namespace std; int n,f[4]; char s[maxn]; int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while (isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();} return x*f; } void out(){ putchar('T'); rep(i,1,n-1) putchar(s[i]); puts("4"); } int main(){ // freopen("in.txt","r",stdin); scanf("%s",s); n=strlen(s)-1; if (s[n]=='4'){ rep(i,1,3){ putchar('T'); rep(j,1,n-1) putchar(s[j]); printf("%d\n",i); } return 0; } if (s[n]=='1') f[1]=f[3]=1; if (s[n]=='2') f[1]=f[2]=1; if (s[n]=='3') f[2]=f[3]=1; out(); while (--n){ int x=s[n]-'0'; if (x==1) { if (f[2]) f[2]=0,out(); } if (x==2){ if (f[3]) f[3]=0,out(); } if (x==3){ if (f[1]) f[1]=0,out(); } } return 0; }