Codeforces Round #349 (Div. 2) C. Reberland Linguistics DP
문자열을 주고 길이가 적어도 5인 접두사를 제거하고 나머지는 길이가 2 또는 3인 꼬치로 자르고 인접한 꼬치가 같지 않으니 마지막에 몇 개의 꼬치로 잘라도 되는지 물어보세요.
아이디어:
dp[i][2]=1은 i, i+1으로 이루어진 직렬이 요구를 충족시킬 수 있음을 나타낸다. dp[i][3]==1은 같은 이치이다.그리고 옮겼다.
i 위치를 고려하면 길이는 2입니다.
(1) (i, i+1)이 (i+2, i+3)와 같으면 dp[i+2][3]===1일 때 dp[i][2]=1;
(i, i+1)이 (i+2, i+3)와 다르면 dp[i+2][2]=1 또는 dp[i+2][3]===1일 때 dp[i][2]=1;
(2) (i, i+1, i+2)와 (i+3, i+4, i+5)가 같으면 dp[i+3][2]===1일 때 dp[i][3]=1;
만약 다르면 dp[i+3][2]=1 또는 dp[i+3][3]==1일 때 dp[i][3]=1;
코드
#include
#include
#include
#include
#include
using namespace std;
const int N=1e5+5;
bool d[N][4];
int main()
{
string s;
cin>>s;
if(s.size()<=6){
printf("0
");return 0;
}
int n=s.size();
d[n][2]=d[n][3]=1;
vector<string>ans;
for(int i=n-2;i>=5;i--){
string now(s,i,2);
string next(s,i+2,2);
d[i][2]=(now!=next)&&d[i+2][2];
d[i][2]=d[i][2]||d[i+2][3];
if(d[i][2])ans.push_back(now);
if(i==n-2)continue;
string now1(s,i,3);
string next1(s,i+3,3);
d[i][3]=(now1!=next1)&&d[i+3][3];
d[i][3]=d[i][3]||d[i+3][2];
if(d[i][3])ans.push_back(now1);
}
sort(ans.begin(),ans.end());
int sum=0;
ans.push_back("");
for(int i=0;i1;i++)
if(ans[i]!=ans[i+1])sum++;
cout<"
";
for(int i=0;i1;i++)
if(ans[i]!=ans[i+1])cout<"
";
return 0;
}
전재 대상:https://www.cnblogs.com/01world/p/5651220.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.