题目网页链接: http://codeforces.com/gym/101745/problem/D
思路:首先可以确保能够成功染色的字符串都是结果串的子串,那么O(n^2)枚举子串之后dp转移即可。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ; ; const int inf=0x3f3f3f3f; ; const double pi=acos(-1.0); #define mem(s,v) memset(s,v,sizeof(s)) #define pdd pair<double,double> #define pii pair<int,int> string s,ss; set<string> se; ][]; int n; int judge(string ss){ ]!=s[]) ; memset(dp,,sizeof(dp)); dp[][]=; int m=ss.size(); ;i<n-;++i){ ;j<m;++j){ if(!dp[i][j]) continue; ]==ss[(j+)%m]) dp[i+][(j+)%m]=; ]==ss[]) dp[i+][]=; } ]){ ;j<m;++j){ ]==ss[j]) dp[i+][j]=; } } } ][m-]; } int main(){ cin>>s; n=s.size(); ;i<n-;++i){ for(int j=i;j<n;++j){ ss=s.substr(i,j-i+); if(judge(ss)) se.insert(ss); } } for(auto it : se){ cout<<it<<endl; } ; }