Koder / 박성훈
article thumbnail

아니 이게 왜 뇌절

오열

 

https://www.acmicpc.net/problem/16500

 

16500번: 문자열 판별

첫째 줄에 길이가 100이하인 문자열 S가 주어진다. 둘째 줄에는 A에 포함된 문자열의 개수 N(1 ≤ N ≤ 100)이 주어진다. 셋째 줄부터 N개의 줄에는 A에 포함된 단어가 한 줄에 하나씩 주어진다. A에

www.acmicpc.net

처음에 그냥 문자열 길이 긴순으로 적당히 나눠보려했는데

aaaaaaaa 뭐 이런 테스트케이스보고 안될거같다고 깨달아버림

dp[k] 를 k-1번째 인덱스까지 문자열을 A에 포함되는 문자열로 만들수 있는지 여부로 정합시다.

그럼 다음 A.length() 개 문자가 서로 똑같을때 dp[k+A.length()] = 1 로 만들어 줄 수 있겠지요

이 과정을 반복해서 dp[s.length()] 를 만들수 있는지 여부를 체크해주면 AC.

 

ㄹㅇ 이걸왜 뇌절쳤지

나병

더보기
#include <bits/stdc++.h>
using namespace std;

vector<string> v;

bool chk[1234] = {0}; 

bool cmp(const string &a, const string &b){
	return a.length()>b.length();
}

int main(){
	string s,tmp;
	cin >> s;
	
	int n;
	cin >> n;
	for(int i=0; i<n; i++){
		cin >> tmp;
		v.push_back(tmp);
	}
	
	sort(v.begin(), v.end(), cmp);
	
	for(auto k : v){
		bool flag = true;
		for(int j=0; j<k.length(); j++){
			if(s[j] != k[j]){
				flag = false;
				break;
			}
		}
				
		if(flag) chk[k.length()] = true;
	}
	
	for(int i=0; i<s.length(); i++){
		if(chk[i]){
			for(auto k : v){
				bool flag = true;
				for(int j=0; j<k.length(); j++){
					if(s[i+j] != k[j]){
						flag = false;
						break;
					}
				}
				
				if(flag) chk[i+k.length()] = true;
			}
		}
	}
	
	cout << chk[s.length()];
	return 0;
}

/*

:thinking:
이거 뭐랄까 A끼리 서로 부분문자열? 인게 문제될거같은데
그냥 길이 긴순으로 replace해서 없애면안되나

:thinking: (2)
아 음 안될거같다는거만 깨달아버림
 
*/

반응형